>  기사  >  Java  >  Java의 이벤트 처리 및 예외 처리 메커니즘 분석

Java의 이벤트 처리 및 예외 처리 메커니즘 분석

高洛峰
高洛峰원래의
2017-01-22 16:50:561038검색

1. 이벤트 처리
사실 이름 이벤트 처리는 자연스럽게 MFC의 메시지 응답 메커니즘을 연상시킵니다. 이는 Nanjue 및 Beizhi의 상황으로 간주되어야 합니다. 이 "새 병"은 이 "오래된 와인"에 응답하는 MFC의 메시지여야 합니다.
소위 "이벤트"는 키보드 키, 마우스 클릭 등과 같이 상태를 변경하고 이 변경에 대한 대응이 필요한 동작이나 무언가로 인해 발생하는 변경입니다. Java의 이벤트는 버튼, 마우스, 키보드, 창 및 기타 이벤트 등 여러 범주로 나눌 수 있습니다.
이벤트 처리 모델
1. 상속 기반 이벤트 처리 모델(JDK1.0)
JDK1.0에서는 이벤트 처리가 상속을 기반으로 먼저 구성 요소로 전송된 후 컨테이너를 따라 상위로 전파됩니다. 수준. 구성 요소에서 처리되지 않는 이벤트는 구성 요소의 컨테이너에 자동으로 전파됩니다. ——이것은 MFC의 원래 이벤트 응답 순서 또는 다형성 응답 메커니즘과 일치하는 것으로 보이며 나중에 언급되는 에이전트 기반 이벤트 처리 메커니즘은 MFC의 콜백 메커니즘과 일치하는 것으로 보입니다.
특정 처리 방법
프로그램 실행 시 발생하는 이벤트를 얻기 위해 action() 메서드 또는 handlerEvent() 메서드를 호출합니다.
2. 에이전트 기반 이벤트 처리 모델(JDK1.1)
이 모델에서는 이벤트를 생성하는 구성 요소로 이벤트가 직접 전송됩니다.
각 구성 요소에 대해 하나 이상의 리스너를 등록합니다. 이벤트를 수신하고 처리하는 이벤트 핸들러.
리스너는 Listener 인터페이스를 구현하는 클래스입니다. 이벤트는 등록된 리스너에게만 보고되는 객체입니다. 각 이벤트에는 해당 리스너 인터페이스가 있습니다.
Button 개체를 마우스로 클릭하면 ActionEvent 이벤트가 전송됩니다. 이 ActionEvent 이벤트는 addActionListener() 메소드를 사용하여 등록된 모든 ActionListener의 actionPerformed() 메소드에 의해 수신됩니다.
에이전트 기반 이벤트 처리 모델의 특징
①이벤트가 실수로 처리되지 않습니다. 계층적 모델에서는 이벤트가 컨테이너에 전파되어 예상치 못한 수준에서 처리될 수 있습니다.
②이벤트 액션을 분류하기 위한 어댑터 클래스를 생성하고 사용할 수 있습니다.
③작품을 다양한 카테고리로 분류하는 것이 도움이 됩니다.
이 이벤트 처리 모델 학습에 집중하세요.
3. 이벤트
이벤트 처리의 세 가지 요소.
(1) 이벤트 소스 이벤트 소스는 버튼, 창, 텍스트 필드 등과 같은 이벤트를 생성하는 소스입니다.
(2) 이벤트 유형 Java의 모든 이벤트는 java.awt.event 패키지에 집중되어 있습니다. 모든 이벤트 클래스는 AWTEvent 클래스와 method-getSouce() 메소드를 상속합니다. 메소드는 이벤트가 발생한 객체를 반환합니다.
(3) 이벤트 리스너 다양한 유형의 이벤트가 발생한 후 이벤트 리스너는 이벤트를 수신하고 해당 이벤트 처리 메서드를 호출합니다. 모든 이벤트 리스너는 실제로 java.util.EventListener 인터페이스를 도입한 java.awt.event 패키지의 인터페이스입니다. 다양한 이벤트 유형에 대한 리스너에는 다양한 방법이 있습니다.
이벤트 처리 단계
① java.awt.event 패키지에 프로그램 추가:
Import java.awt.event;
② 필수 이벤트 소스 개체에 대한 이벤트 리스너 등록:
이벤트 소스 Object.addXXXListener(XXXListener);
③ 해당 메소드를 구현합니다. 리스너 인터페이스에 여러 메서드가 포함된 경우 모든 메서드를 구현해야 합니다
예: b2.addActionListener(this)
4. 이벤트 어댑터(어댑터)
각 리스너 인터페이스의 모든 메서드 구현 작업 부하가 매우 큽니다. 편의를 위해 Java 언어는 여러 메소드를 사용하여 클래스를 구현하는 Adapters 클래스를 제공합니다.
귀하가 정의한 리스너는 Adapter 클래스를 상속할 수 있으며 필요한 메서드만 재정의하면 됩니다.
예를 들어, 창 이벤트에 해당하는 리스너는 windowListener이며, windowOpened(), windowClosed(), windowClosing(), WindowIconfied(), WindowDeiconfied(), WindowActivated(), WindowDeactivated()를 비롯한 여러 메서드를 구현해야 합니다. , 이는 불필요한 프로그래밍 작업량을 증가시킵니다.
WindowAdapter를 상속하는 경우 모든 메서드가 아닌 하나 또는 몇 개의 메서드만 구현하면 됩니다. 다음 예제 중 다수는 창이 닫힐 때 시스템을 종료할 목적으로 windowClosing() 메서드만 구현합니다.
4.1 버튼 이벤트 처리
버튼을 클릭했을 때 발생하는 이벤트를 액션 이벤트
액션 이벤트에 해당하는 이벤트 클래스를 ActionEvent 클래스
액션 이벤트에 해당하는 이벤트 리스너 is: ActionListener
리스너의 주요 메소드:
액션 이벤트가 발생할 때 actionPerformed(ActionEvent e)가 호출됩니다.
액션 이벤트의 작업 프로젝트 구현:
첫 번째 단계는 액션 이벤트 리스너 addActionListener(ActionListener).
두 번째 단계는 ActionListener 인터페이스의 메소드를 구현하는 것입니다: actionPerformed(ActionEvent e)
4.2 마우스 이벤트 처리
마우스 이벤트를 발생시키는 이벤트 소스는 일반적으로 컨테이너에 마우스가 들어가거나 나갈 때, 또는 컨테이너 안에서 마우스를 클릭하거나 드래그할 때 마우스 이벤트가 발생합니다.
마우스 이벤트에 해당하는 이벤트 클래스는 다음과 같습니다. MouseEvent 클래스
MouseEvent 클래스의 메서드:
getX()는 마우스의 X 좌표를 가져옵니다.
getY()는 마우스의 Y 좌표를 가져옵니다.
getPoint()는 마우스의 위치를 ​​가져옵니다.
마우스 이벤트에 해당하는 이벤트 리스너는 2개입니다. MouseListener(또는 MouseAdapter)는 마우스 이벤트에 해당하고, MouseMotionListener(또는 MouseMotionAdapter)는 마우스 이동 이벤트에 해당합니다.
MouseListener(또는 MouseAdapter)의 주요 메소드
MousePressed(MouseEvent e) 마우스를 눌렀을 때의 처리 메소드
MouseReleased(MouseEvent e) 마우스를 놓을 때의 처리 메소드
MouseEntered(MouseEvent e) 마우스가 들어갔을 때의 처리 방법
MouseExited(MouseEvent e) 마우스가 마우스를 떠날 때의 처리 방법
마우스 클릭 시의 처리 방법 MouseClicked(MouseEvent e)

MouseMotionListener(또는 MouseMotionAdapter)의 주요 메소드
MouseMoved(MouseEvent e) 마우스 이동 시 처리 방식
MouseDraged(MouseEvent e) 마우스 드래그 시 처리 방식
4.3 키보드 이벤트 처리
키보드 이벤트 발생 키보드 포커스가 있는 구성 요소에서 키보드를 누르거나 떼는 경우
키보드 이벤트에 해당하는 이벤트 클래스는 KeyEvent 클래스입니다.
키 getKeyCode(). 코드를 누르거나 떼는 경우
getKeyText()는 누르거나 떼는 키의 문자열을 가져옵니다.
키보드 이벤트에 해당하는 이벤트 리스너는 KeyListener 또는 KeyAdapter입니다.
기본 메서드:
KeyPressed(KeyEvent e) 처리 키보드를 눌렀을 때의 메소드
키보드를 놓을 때의 처리 방법 KeyReleased (KeyEvent e)
4.4 윈도우 이벤트 처리
Window 및 확장 클래스(Frame, Dialog) 등에 의해서만 트리거될 수 있습니다. . 창이 활성/무효 상태, 아이콘/비아이콘 상태, 열림/닫힘 상태 등을 나타내는 창 이벤트입니다.
창 이벤트에 해당하는 클래스는 WindowEvent이고 리스너는 WindowListener(또는 WindowAdapter)
메인 메소드 :
windowOpened(WindowEvent e) 윈도우를 여는 이벤트 처리
windowClosed(WindowEvent e) 윈도우를 닫는 이벤트 처리
windowClosing(WindowEvent e) 윈도우를 닫는 이벤트 처리
상태 활성화를 위한 WindowActivated(WindowEvent e) 이벤트 처리
WindowDeactivated(WindowEvent e) 유효하지 않은 상태 이벤트 처리
4.5 기타 이벤트 처리
4.5.1 체크박스 및 라디오버튼 이벤트 처리
이벤트 클래스는 ItemEvent:
옵션 이벤트 대응 이벤트 리스너는: ItemListener
메소드:
옵션 이벤트 발생 시 ItemStateChanged(ItemEvent e)가 호출됩니다.
4.5.2 스크롤 바 이벤트 처리
조정 이벤트에 해당하는 이벤트 클래스는 다음과 같습니다. 4.5.3 드롭다운 목록의 이벤트 처리
이벤트 클래스는 Item 이벤트:
옵션 이벤트에 해당하는 이벤트 리스너는 ItemListener
메서드:
itemStateChanged(ItemEvent e)가 호출됩니다. 드롭다운 목록에서 액션이 발생할 때
(드롭다운 목록의 이벤트 처리 및 이벤트 유형을 알 수 있으며, 이벤트 리스너 및 메소드는 체크박스 및 라디오 버튼에 대한 이벤트 핸들러와 동일합니다. )
4.5.4 메뉴 이벤트 처리
메뉴 이벤트는 일반적으로 메뉴를 클릭했을 때 해당 항목 중에 발생한 이벤트입니다.
메뉴 항목에는 두 가지 유형이 있습니다.
MenuItem 액션 이벤트
CheckboxMenuItem, 옵션 이벤트
MenuItem 이벤트 처리
첫 번째 단계는 모든 MenuItem 메뉴 항목에 대해 액션 이벤트 모니터를 등록하는 것입니다. Listener addActionListener( 액션리스너).
두 번째 단계는 ActionListener 인터페이스의 메소드인 actionPerformed(ActionEvent e)를 구현하는 것입니다. 이 메소드에서는 e.getSource()를 사용하여 사용자가 선택한 메뉴 항목을 획득하고 해당 처리를 수행합니다.
CheckboxMenuItem 이벤트 처리
첫 번째 단계는 모든 CheckMenuItem 메뉴 항목에 대해 옵션 이벤트 리스너 addItemListener(ItemListener)를 등록하는 것입니다.
두 번째 단계는 ItemListener 인터페이스의 메소드(itemStateChanged(ItemEvent e))를 구현하는 것입니다. 이 메소드에서는 e.getSource()를 사용하여 사용자가 선택한 메뉴 항목을 가져오고, e.getItem()을 사용하여 사용자가 선택한 메뉴 항목의 레이블을 가져오고, e.getStateChange()를 사용하여 선택 여부를 가져옵니다. , 해당 처리를 수행합니다.

2. 예외 처리
좋은 프로그래밍 언어와 프로그래머는 널리 사용되는 객체 지향 프로그래밍 언어인 Java로서 예외 처리 메커니즘은 당연히 중요한 기능 중 하나입니다.
일반적으로 예외를 설명할 때 프로그래밍 오류라고 합니다. 그러나 실제로 이 오류는 매우 자주 발생하며 컴파일 오류, 연산 오류(구체적으로는 시스템 연산 오류, 논리 연산 오류로 구분됩니다. 이러한 종류의 시스템 연산 오류는 거의 없습니다. 프로그래밍 실수라고 생각하세요. )
JAVA에서 예외는 Throwable 클래스를 상속받은 클래스입니다. 각 예외 클래스는 런타임 오류를 나타냅니다(참고: 런타임 오류입니다). 예외 클래스에는 실행 중인 오류 및 오류 처리 방법에 대한 정보가 포함되어 있습니다.
Java의 예외 처리 메커니즘:
Java 프로그램을 실행하는 동안 인식 가능한 실행 오류가 발생할 때마다(즉, 오류에 해당하는 예외 클래스가 있는 경우) 시스템은 해당 예외를 생성합니다. 예외 클래스의 생성(참고: 예외 클래스 객체 생성이라고 합니다.)은 예외를 생성한다는 의미입니다.
비정상적인 개체가 생성되면 시스템에는 충돌, 무한 루프 또는 운영 체제에 대한 기타 손상이 발생하지 않도록 이를 처리하는 해당 메커니즘이 있어야 하며 이를 통해 전체 프로그램의 안전이 보장됩니다.
예외 및 예외 클래스:
오류: Java 가상 머신에 의해 생성 및 발생되었으며 Java 프로그램에 의해 처리되지 않았습니다.
런타임 예외(0으로 나누기, 범위를 벗어난 배열 첨자 등의 시스템 오류): 시스템, 사용자의 Java 프로그램은 처리할 필요가 없으며 시스템은 이를 기본 예외 처리기에 넘겨줍니다(참고: 기본 예외 처리가 있음)
예외(예상 가능한 프로그램 문제): Java 컴파일러에는 Java가 필요합니다. 프로그램은 모든 비런타임 예외를 캡처하거나 선언해야 합니다.
사용자 생성 예외
예외 클래스
생성자:
public Exception();
public Exception(String s); 문자 허용 문자열 매개변수로 전달되는 정보는 일반적으로 예외에 해당하는 오류에 대한 설명입니다.
Exception 클래스는 또한 아버지 Throwable로부터 여러 메서드를 상속하는데, 그중 일반적으로 사용되는 메서드는 다음과 같습니다.
1) public String toString();
toString() 메서드는 현재 Exception 클래스를 설명하는 문자열을 반환합니다. 정보.
2) public void printStackTrace();
printStackTrace() 메서드에는 반환 값이 없습니다. 이 메서드의 기능은 인쇄 작업을 완료하고 현재 표준 출력에 현재 예외 개체의 스택 사용량을 인쇄하는 것입니다(일반적으로 화면) 궤적, 즉 개체 또는 클래스의 메서드가 프로그램에 의해 연속적으로 호출되고 실행되어 실행 프로세스 중에 이 예외 개체가 생성되도록 합니다.
시스템 정의 실행 예외
이러한 하위 클래스 중 일부는 시스템에 의해 사전 정의되고 시스템 정의 실행 예외라고 하는 Java 클래스 라이브러리에 포함됩니다.
사용자 정의 예외
특정 응용 프로그램의 경우 특정 실행 오류는 프로그래머가 프로그램의 특별한 논리에 따라 사용자 프로그램에서 사용자 정의 예외 클래스와 예외 개체를 생성해야 합니다.
사용자 정의 예외는 일반적으로 예외 클래스의 상위 클래스로 Exception을 사용합니다
그러나 아직 이해되지 않은 질문이 있습니다. 오류가 발생하면 시스템이 오류가 인식되었는지 어떻게 알 수 있습니까? 해당 예외 클래스 객체를 생성하는 방법은 무엇입니까? 예외 객체는 이를 해결하기 위해 해당 메서드를 사용하는 방법을 어떻게 알 수 있나요? 해당 예외를 처리하는 각 예외 클래스 객체에 대해 예외 처리 방법이 하나만 있습니까? ————————————statement throw를 통해 사용자 정의 예외가 발생하는 것으로 나타났습니다.
사용자 정의 예외를 생성할 때 일반적으로 다음 작업을 완료해야 합니다.
1) 새 예외 클래스를 선언하고 Exception 클래스나 기타 기존 시스템 예외 클래스 또는 사용자 예외를 상위 클래스로 사용하도록 합니다. .
2) 새로운 예외 클래스에 대한 속성 및 메소드를 정의하거나, 상위 클래스의 속성 및 메소드를 오버로드하여 이러한 속성 및 메소드가 해당 클래스에 해당하는 오류 정보를 반영할 수 있도록 합니다.
예외 발생
Java 프로그램이 실행 중에 식별 가능한 오류가 발생하면 해당 오류에 해당하는 예외 클래스의 개체가 생성됩니다. 이 프로세스를 예외 발생이라고 합니다.
실제로 해당 인스턴스의 인스턴스입니다. 예외 클래스 객체가 발생합니다.
예외 유형에 따라 예외를 발생시키는 방법에는 시스템에서 자동으로 발생시키는 방법과 사용자에 의해 발생시키는 두 가지 방법이 있습니다.
1. 시스템에서 자동으로 발생시키는 방법
사용되는 시스템 정의 실행 오류 예외는 다음과 같습니다. 모두 시스템에서 throw됩니다. 자동으로 throw합니다
2. 사용자가 throw하면
사용자가 정의한 예외는 시스템에서 자동으로 throw할 수 없으며 Java 문을 사용하여 사용자가 throw해야 합니다. throw 문
형식으로 "예외"
를 명시적으로 던지려면반환 유형 메서드 이름(매개변수 목록) 발생 예외 클래스 이름 목록 {
                                                                         ​🎜> 참고:
1) 일반적으로 프로그램에서 특정 조건이 충족되면 예외가 발생합니다.
종종 throw 문은 if 문의 if 분기에 배치됩니다.
if(I>100)
throw (new MyException() ; 상위 메서드는 작업 중에 발생할 수 있는 예외를 수락하고 처리할 준비가 되어 있습니다.
메소드에 하나 이상의 throw 문이 있는 경우 가능한 모든 예외가 메소드 헤더에 나열되어야 합니다. throws
3) Java 언어 throws 키워드로 선언된 모든 클래스와 throw로 던져진 객체는 필수입니다. Throwable 클래스 또는 그 서브클래스여야 합니다. throw할 수 없는 개체를 throw하려고 하면 Java 컴파일러에서 오류를 보고합니다.
예외 처리:
예외를 잡는 방법, 예외를 잡은 후 프로그램을 점프하는 방법, 예외를 작성하는 방법을 주로 고려합니다. 명세서 처리
1. try...catch...finally block
1) try
try 문의 { }에는 하나 이상의 예외를 발생시킬 수 있는 프로그램 코드가 포함되어 있습니다.
이 코드는 실제로 그 뒤에 있는 catch를 지정합니다. 블록이 포착할 수 있는 예외의 범위입니다.
Java 프로그램이 try 블록의 문에 실행될 때 예외가 발생하면 더 이상 try 블록의 다른 문을 계속 실행하지 않고 직접 catch 블록에 들어가서 첫 번째로 일치하는 예외 유형을 찾아 deal을 실행합니다. 와 함께.
2) Catch 블록
catch 문의 매개변수는 예외 유형과 예외 개체를 포함하여 메서드 정의와 유사합니다.
예외 유형은 catch 문에 의해 처리되는 예외 유형을 지정하는 Throwable 클래스의 하위 클래스여야 합니다.
예외 객체는 다음으로 지정된 프로그램 코드 블록의 중괄호 안에 Java 런타임 시스템에 의해 발생됩니다. try 예외 개체를 처리하기 위한 메서드 코드가 포함되어 있습니다.
각기 다른 유형의 예외를 처리하기 위해 여러 개의 catch 문이 있을 수 있습니다.
Java 런타임 시스템은 일치하는 catch 문을 찾을 때까지 각 catch 문에서 처리하는 예외 유형을 위에서 아래로 감지합니다.
여기서 유형 일치는 catch의 예외 유형이 생성된 예외 객체의 유형과 완전히 일치하거나 예외 객체의 상위 클래스라는 것을 의미합니다. 따라서 catch 문의 정렬 순서는 특수 클래스부터 특수 클래스까지여야 합니다. 일반적인. (이유를 생각해 보세요)
3) finally 블록
finally 문은 예외 처리 이벤트를 위해 제공되는 정리 메커니즘이라고 할 수 있습니다. 일반적으로 파일을 닫거나 다른 시스템 리소스를 해제하는 데 사용됩니다
. -catch-finally 문 문에는 finally 부분이 있을 수 없습니다.
finally 부분이 없으면 try에 지정된 프로그램 코드에서 예외가 발생하면 다른 프로그램 코드는 실행되지 않습니다.
finally 부분이 있으면 try 블록에서 예외가 발생하든 관계없이, catch 부분의 문을 실행한 후 finally 부분의 문을 실행해야 합니다.
문의 마지막 부분이 예외 처리를 위한 통합 종료를 제공하는 것을 볼 수 있습니다.
다중 예외 처리
try 블록은 여러 가지 예외를 생성할 수 있습니다. 이러한 예외를 처리하기 위해 다양한 방법을 사용하려면 다중 예외 처리 메커니즘을 사용해야 합니다.
다중 예외 처리는 try 블록 뒤에 여러 개의 catch 블록을 정의하여 달성됩니다. 각 catch 블록은 특정 예외 개체를 수신하고 처리하는 데 사용됩니다.
catch 블록의 매개 변수를 통해 예외 개체를 판단합니다. 이 catch 블록에 의해 수신되고 처리됩니다.
은 예외 개체와 catch 블록의 예외 매개 변수의 일치를 기반으로 어떤 catch 블록에서 얻어집니다. 다음 세 가지 조건 중 하나를 충족하면 예외 개체와 매개 변수가 일치하는 것으로 간주됩니다.
1) 예외 객체와 매개변수는 동일한 예외 클래스에 속합니다.
2) 예외 객체는 매개변수 예외 클래스의 하위 클래스에 속합니다.
3) 예외 객체는 매개변수로 정의된 인터페이스를 구현합니다.
try 블록에서 생성된 예외 개체가 첫 번째 catch 블록에 의해 수신되면 프로그램 흐름은 문 블록이 실행된 후 바로 이 catch 문 블록으로 이동합니다. 무시됩니다
try 블록에 의해 생성된 예외 개체가 첫 번째 catch 블록과 일치하지 않으면 시스템은 일치를 위해 자동으로 두 번째 catch 블록으로 이동합니다. 세 번째, 네 번째... 예외 개체를 받을 수 있는 catch 블록을 찾고 프로세스 점프를 완료할 때까지입니다.
try 블록에서 생성된 예외 개체가 첫 번째 catch 블록에 의해 수신되면 프로그램 흐름은 문 블록이 실행된 후 바로 이 catch 문 블록으로 이동합니다.
try 블록에 의해 생성된 예외 개체가 첫 번째 catch 블록과 일치하지 않으면 시스템은 자동으로 두 번째 catch 블록으로 이동하여 두 번째 catch 블록과 일치하지 않으면 다음으로 이동합니다. 세 번째, 네 번째... 예외 개체를 받을 수 있는 catch 블록을 찾고 프로세스 점프를 완료할 때까지입니다.
try 블록의 모든 문을 실행해도 예외가 발생하지 않으면 모든 catch 블록이 무시되고 실행되지 않습니다.
참고:
1) catch 블록의 문은 다양한 예외에 따라 다른 작업을 수행해야 합니다.
따라서 여러 예외를 처리할 때는 각 catch 블록의 순서를 신중하게 설계해야 합니다. 일반적으로 보다 구체적이고 일반적인 예외를 처리하는 catch 블록은 앞쪽에 배치되고, 여러 예외를 일치시킬 수 있는 catch 블록은 뒤쪽에 배치되어야 합니다.

/*尝试用户运行错误的异常处理: 
 问题是这样的,当输入的用户工资初值少于800则是错误的,当然工资的变化如果超过20%,则也是错误的 
*/
import java.awt.*; 
import java.applet.*; 
import java.awt.event.*; 
public class UserExceptionApplet extends Applet implements ActionListener{ 
 Label prompt1=new Label("请输入雇员姓名和工资初值:"); 
 Label prompt2=new Label("请输入欲修改的工资"); 
 TextField name,isal,nsal; 
 String msg; 
 Employee Emp; 
 Button okBtn=new Button("OK"); 
 Button cancelBtn=new Button("Cancel"); 
 public void init(){ 
  name=new TextField(5); 
  isal=new TextField(5); 
  nsal=new TextField(5); 
  add(prompt1); 
  add(name); 
  add(isal); 
  add(prompt2); 
  add(nsal); 
  add(okBtn); 
  okBtn.addActionListener(this); 
  cancelBtn.addActionListener(this); 
  add(cancelBtn); 
 } 
 public void paint(Graphics g){ 
  g.drawString(msg,0,80); 
 } 
 public void CreateEmp(String empName,double sa){ 
  try{ 
   Emp=new Employee(empName,sa); 
   msg=new String(Emp.toString()); 
  } 
  catch(IllegalSalaryException ise){ 
   msg=new String(ise.toString()); 
  } 
 } 
 public void ChangeEmpSal(double changeSal){ 
  try{ 
   Emp.setEmpSalary(changeSal); 
   msg=new String(Emp.toString()); 
  } 
  catch(IllegalSalaryException illSal){ 
   msg=new String(illSal.toString()); 
  } 
  catch(IllegalSalaryChangeException illSalChange){ 
   msg=new String(Emp.toString()+illSalChange.toString()); 
  } 
 } 
 public void actionPerformed(ActionEvent e){ 
  String empName; 
  double empSal,changeSal; 
  Object obj=e.getSource(); 
  if(obj==okBtn){ 
   empName=new String(name.getText()); 
   if(empName==null){ 
    msg=new String("请先输入雇员姓名工资并创建之");  
   } 
   if(nsal.getText()==null){ 
    empSal=Double.valueOf(isal.getText()).doubleValue(); 
    CreateEmp(empName,empSal); 
   } 
   else{ 
    changeSal=Double.valueOf(nsal.getText()).doubleValue(); 
    ChangeEmpSal(changeSal); 
   } 
  } 
  if(obj==cancelBtn){ 
   naem.setText(""); 
   isal.setText(""); 
   nsal.setText(""); 
  } 
  repaint(); 
 }  
} 
  
class Employee{ 
 String m_EmpName; 
 double m_EmpSalary; 
   
 Employee(String name,double initsalary)throws IllegalSalaryException{ 
  m_EmpName=name;//看这里有问题没,参考代码为m_EmpName=new String(name); 
  if(initsalary<800){ 
   throw(new IllegalSalaryException(this,initsalary));//throw语句 
  } 
  m_EmpSalary=initsalary; 
 } 
 public String getEmpName(){ 
  return m_EmpName; 
 } 
 public double getEmpSalary(){ 
  return m_EmpSalary; 
 } 
   
 public boolean setEmpSalary(double newSal) throws IllegalSalaryException,IllegalSalaryChangeException{ 
  if(newSal<800) 
   throw(new IllegalSalaryException(this,newSal)); 
  else if(getEmpSalary()==0.0){ 
   m_EmpSalary=newSal; 
   return true; 
  } 
  else if(Math.abs(newSal-getEmpSalary())/getEmpSalary()>=0.2) 
   throw(new IllegalSalaryChangeException(this,newSal-getEmpSalary()));  
  else{ 
   m_EmpSalary=newSal; 
   return true; 
  } 
 } 
 public String toString(){ 
  String s; 
  s="姓名:"+m_EmpName+"工资: "+m_EmpSalary; 
  return s; 
 } 
} 
  
class IllegalSalaryException extends Exception{ 
 private Employee m_ConcernedEmp; 
 private double m_IllegalSalary; 
  
 IllegalSalaryException(Employee emp,double isal){ 
  super("工资低于最低工资"); 
  m_ConcernedEmp=emp; 
  m_IllegalSalary=isal; 
 } 
 public String toString(){ 
  String s; 
  s="为雇员提供的工资不合法:雇员:"+m_ConcernedEmp.getEmpName()+"非法工资:"+m_IllegalSalary+"低于最低工资数额800元"; 
  return s; 
 } 
} 
  
class IllegalSalaryChangeException extends Exception{ 
 private Employee m_ConcernedEmp; 
 private double m_IllegalSalaryChange; 
  
 IllegalSalaryChangeException(Employee emp,double csal){ 
  super("工资变动太大"); 
  m_ConcernedEmp=emp; 
  m_IllegalSalaryChange=csal; 
 } 
 public String toString(){ 
  String s; 
  s="为雇员提供的工资变动不合法:雇员:"+m_ConcernedEmp.getEmpName()+"非法变动工资变化:"+m_IllegalSalaryChange+"高于原工资的20%"; 
  return s; 
 } 
}

Java의 이벤트 처리 및 예외 처리 메커니즘을 분석하는 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.