나는 교사로부터 향후 연구에서 대부분의 이상이 무효 인 포인터 예외라고 들었습니다. 그러니 시간이 좀 걸리면 널 포인터 예외가 무엇인지 확인하기 위해 게임을하는 데 시간이 걸립니다.
1 : 널 포인터 예외가 발생하는 주된 이유는 다음과 같습니다.
(1) 객체가 존재하지 않으면 예외가 생성됩니다.
(2) 객체에 존재하지 않는 필드에 액세스하거나 수정할 때, 예외는 obj.method () // 메소드가 존재하지 않습니다.
(3) 문자열 변수는 초기화되지 않습니다.
(4) 인터페이스 유형 객체는 다음과 같은 특정 클래스로 초기화되지 않습니다.
목록 lt; 오류를보고합니다
LT = New ArrayList (); 오류가 없습니다
물체의 값이 비어 있으면 비어있는 것으로 판단하지 않습니다. 다음 코드 전에 코드 줄을 추가 할 수 있습니다.
if (rb! = null && rb! = "")
변경 :
if (rb == null); if (rb! == null && rb! = "") 또는 if (( ""). Equals (rb))
널 포인터에 대한 솔루션 :
오류가 발생하는 선에 초점을 맞추고 NULL 포인터 예외로 인한 두 가지 주요 이유를 통해 특정 오류를 진단하십시오. 동시에, 널 포인터의 발생을 피하기 위해 판단 처리를 수행 할 때 설정 값 앞에 "null"또는 null 값을 배치하는 것이 가장 좋습니다.
일반적인 널 포인터 예외에 대한 간단한 분석 :
(1) 널 포인터 오류 java.lang.nullpointerexception
Java에는 8 개의 기본 데이터 유형이 있습니다. 변수 값은 기본값을 가질 수 있습니다. 정상 할당없이 추가되면 Java 가상 머신을 올바르게 컴파일 할 수 없습니다. 따라서 기본 Java 데이터 유형을 사용하면 일반적으로 널 포인터 예외를 유발하지 않습니다. 실제 개발에서 대부분의 NULL 포인터 예외는 주로 객체 작업과 관련이 있습니다.
2. Java 예외 처리 메커니즘
예외가있을 수있는 코드를 처리하는 두 가지 방법이 있습니다.
먼저, 방법의 시도를 사용하여 예외를 작성하고 처리하십시오. 캐시 문은 여러 예외를 일치시키기 위해 여러 가지를 가질 수 있습니다. 예를 들어:
public void p (int x) {try {...} catch (예외 e) {...} 마침내 {...}} 둘째, 처리 할 수없는 예외 또는 변환 해야하는 예외는 방법의 선언에 전달하십시오.
던져 진술은 예외를 던졌습니다. 예를 들어:
public void test1 ()는 myexception {... if (....) {throw new myException ();}}각 메소드가 단순히 예외를 던지면, 다중 계층 중첩 메소드 통화 메소드에서 Java 가상 머신은 예외를 처리하는 코드 블록이 발견 될 때까지 예외가 발생하는 메소드 코드 블록에서 검색됩니다. 그런 다음 처리를 위해 예외를 해당 캐치 명령문에 전달하십시오. Java Virtual Machine이 메소드 호출 스택의 맨 아래의 Main () 메소드로 추적되면 예외를 처리하는 코드 블록을 아직 찾을 수없는 경우 다음 단계가 처리됩니다.
먼저 예외 객체의 printStackTrace () 메소드를 호출하고 메소드 호출 스택의 예외 정보를 인쇄하십시오.
둘째, 발생하는 스레드가 예외가 기본 스레드 인 경우 전체 프로그램 실행이 종료됩니다. 메인 스레드가 아닌 경우 스레드가 종료되고 다른 스레드가 계속 실행됩니다.
분석과 사고를 통해 비정상적인 처리가 일찍 발생할수록 자원과 시간이 작을수록 영향의 범위가 작다는 것을 알 수 있습니다. 따라서 발신자에게도 처리 할 수있는 예외를 제외하지 마십시오.
다른 요점은 무시할 수 없습니다. 마지막으로 문은 어떤 경우에도 코드를 실행해야하므로 어떤 경우에도 실행 해야하는 일부 코드의 신뢰성을 보장 할 수 있습니다. 예를 들어, 데이터베이스 쿼리가 비정상적인 경우 JDBC 연결을 해제해야합니다. 마지막 명령문은 순서 나 위치에 관계없이 반환 문 앞에 실행됩니다. 최종 문자가 실행되지 않은 유일한 상황은 메소드가 System.exit () 메소드를 실행한다는 것입니다. System.exit () 기능은 현재 실행중인 Java Virtual Machine을 종료합니다. 최종 문자 블록의 변수에 새 값을 할당하여 반환의 반환 값을 변경할 수 없습니다. 또한 마지막 블록에서 리턴 명령문을 사용하지 않는 것이 좋습니다. 의미가 없으며 오류로 쉽게 이어질 수 있습니다.
마지막으로 예외 처리를 위해 구문 규칙에주의를 기울여야합니다.
먼저 시도 진술은 혼자 존재할 수 없지만 캐치와 마지막으로 구성 될 수 있습니다.
시도해 ... 마침내 ... 마침, 시도, 시도, 마침내 ... 마침내 시도해보십시오 ... 마침내 캐치 진술에는 하나 이상의 문장이있을 수 있으며 마지막으로 진술은 최대의 진술이 될 수 있습니다. 세 가지 키워드는 시도하고 잡히고 마지막으로 만 사용할 수 없습니다.
둘째, 세 코드 블록의 변수 범위는 독립적이며 서로 액세스 할 수 없습니다. 세 블록 모두에서 액세스 할 수 있으려면이 블록 외부의 변수를 정의해야합니다.
셋째, 다중 캐치 블록을 사용하면 Java 가상 머신은 예외 클래스 또는 하위 클래스 중 하나와 일치하고 다른 캐치 블록을 실행하지 않고 캐치 블록을 실행합니다.
넷째, 던져 진술 후에 따르는 다른 진술은 없습니다. 이는 실행할 기회가 없기 때문입니다.
다섯째, 한 메소드가 예외를 선언하는 다른 메소드를 호출하면이 메소드는 예외를 처리하거나 던진을 선언합니다.
2.2 스로우와 던지기 키워드의 차이 :
던지기는 방법 본문 내부에서 예외를 던지는 데 사용됩니다. 구문 형식은 다음과 같습니다.
던지기는 방법에 의해 어떤 예외가 발생 될 수 있는지 선언하는 데 사용됩니다. 메소드 이름 후에 구문 형식은 다음과 같습니다.
예외 유형 1, 예외 유형 2 ... 예외 유형 n을 던집니다.
3 : 다음은 NULL 포인터 예외가 발생할 수있는 몇 가지 상황과 해당 솔루션을 나열합니다.
코드 스 니펫 1 :
out.println (request.getParameter ( "username"));
분석 : 코드 세그먼트 1의 기능은 매우 간단하며 사용자 입력 "사용자 이름"의 값을 출력하는 것입니다.
참고 : 위의 진술은 구문 오류를 찾을 수 없으며 대부분의 경우 아무런 문제가 없습니다. 그러나 사용자가 데이터를 입력 할 때 양식 필드 "사용자 이름"의 값을 제공하지 않거나 어떤 방식 으로든 직접 입력하는 양식을 우회하지 않으면이 요청의 값 ( "사용자 이름")이 비어 있습니다 (빈 문자열이 아니라 빈 객체가 아닌 객체의 인쇄 방법이 직접 작동 할 수 없을 것입니다. "java.lang.nullpointerexception"예외. 또한 객체가 비어 있더라도 java.lang.object 또는 객체 객체 자체의 일부 방법 (예 : Tostring), Equal (Object OBJ) 및 기타 작업 방법이 호출됩니다.
코드 스 니펫 2 :
문자열 username = request.getParameter ( "사용자 이름"); if (username.equals ( "root")) {...}분석 : 코드 세그먼트 2의 기능은 사용자가 제공 한 사용자 이름을 감지하는 것입니다. 사용자 이름이 "루트"인 사용자 인 경우 일부 특수 작업이 수행됩니다.
참고 : 코드 세그먼트 2에서 사용자가 양식 필드 "사용자 이름"의 값을 제공하지 않으면 문자열 객체 사용자 이름은 NULL 값이며 하나의 NULL 객체는 다른 객체와 직접 비교할 수 없습니다. 마찬가지로 코드 세그먼트 2가있는 JSP 페이지에 빈 포인터 오류가 발생합니다.
작은 속임수 : 특정 방법의 반환 값을 상수와 비교하고 상수를 그 앞에 놓으려면 널 객체의 동등한 메소드를 호출하지 않을 수 있습니다. 예를 들어:
if ( "root".equals (username)) {...}사용자 이름 객체가 널 객체를 반환하더라도 여기에는 널 포인터 예외가 없으며 평소와 같이 실행할 수 있습니다.
스 니펫 3 :
문자열 username = session.getAttribute ( "session.username"). toString ();
분석 : 코드 세그먼트 3의 함수는 세션에서 세션 값을 꺼내어 문자열 객체 사용자 이름에 값을 할당하는 것입니다.
참고 : 일반적으로 사용자가 이미 세션이있는 경우 문제가 발생하지 않습니다. 그러나 현재 응용 프로그램 서버가 다시 시작되고 사용자가 다시 로그인하지 않은 경우 (사용자가 브라우저를 닫지 만 여전히 원래 페이지를 열 수도 있습니다.) 현재 세션 값이 유효하지 않아 세션의 값이 비어있게됩니다. NULL이있는 객체에서 TOSTRING () 작업을 직접 실행하면 시스템이 NULL 포인터 예외를 던지게됩니다.
스 니펫 4 :
public static void main (String args []) {person p = null; p.setName ( "Zhang San"); System.out.println (p.getName ()); }분석 : 사람 객체를 선언하고 객체에서 이름 이름을 인쇄하십시오.
참고 : 이 시점에서 P는 널 포인터 예외를 가질 것입니다.이 사람 유형 객체가 객체를 생성하지 않았다고 선언했기 때문에 힙에 주소 참조가 없습니다. 객체를 사용하고 메소드를 사용할 때 반드시 객체를 만들 필요는 없습니다.
A : 물체가 비어 있는지 여부에 관계없이 직접 사용하십시오.
(JSP) 코드 세그먼트 1 :
out.println (request.getParameter ( "username"));
분석 : 코드 세그먼트 1의 기능은 매우 간단하며 사용자 입력 "사용자 이름"의 값을 출력하는 것입니다.
참고 : 위의 진술은 구문 오류를 찾을 수 없으며 대부분의 경우 아무런 문제가 없습니다. 그러나 사용자가 데이터를 입력 할 때 양식 필드 "사용자 이름"의 값을 제공하지 않거나 어떤 방식 으로든 직접 입력하는 양식을 우회하지 않으면이 요청의 값 ( "사용자 이름")이 비어 있습니다 (빈 문자열이 아니라 빈 객체가 아닌 객체의 인쇄 방법이 직접 작동 할 수 없을 것입니다. "java.lang.nullpointerexception"예외. 또한 객체가 비어 있더라도 java.lang.object 또는 객체 객체 자체의 일부 방법 (예 : Tostring), Equal (Object OBJ) 및 기타 작업 방법이 호출됩니다.
(JSP) 스 니펫 2 :
문자열 username = request.getParameter ( "사용자 이름"); if (username.equals ( "root")) {...}분석 : 코드 세그먼트 2의 기능은 사용자가 제공 한 사용자 이름을 감지하는 것입니다. 사용자 이름이 "루트"인 사용자 인 경우 일부 특수 작업이 수행됩니다.
참고 : 코드 세그먼트 2에서 사용자가 양식 필드 "사용자 이름"의 값을 제공하지 않으면 문자열 객체 사용자 이름은 NULL 값이며 하나의 NULL 객체는 다른 객체와 직접 비교할 수 없습니다. 마찬가지로 코드 세그먼트 2가 위치한 JSP 페이지는 (java.lang.nullpointerexception) NULL 포인터 오류를 던집니다.
(JSP) 스 니펫 3 :
문자열 username = session.getAttribute ( "session.username"). toString ();
분석 : 코드 세그먼트 3의 함수는 세션에서 세션 값을 꺼내어 문자열 객체 사용자 이름에 값을 할당하는 것입니다.
참고 : 일반적으로 사용자가 이미 세션이있는 경우 문제가 발생하지 않습니다. 그러나 현재 응용 프로그램 서버가 다시 시작되고 사용자가 다시 로그인하지 않은 경우 (사용자가 브라우저를 닫지 만 여전히 원래 페이지를 열 수도 있습니다.) 현재 세션 값이 유효하지 않아 세션의 값이 비어있게됩니다. NULL 인 객체에서 TOSTRING () 작업을 직접 실행하면 시스템이 (java.lang.nullPointerException) NULL 포인터 예외를 던지게됩니다.
위는 편집자가 가져온 Null 포인터 예외의 Java Exception 처리에 대한 간단한 토론의 전체 내용입니다. 모두가 wulin.com을 더 지원하기를 바랍니다