자바 핵심 기술 (6) : 비정상

1. 오류 처리

  예외 처리 작업은 오류가 발생한 위치에서이 상황을 처리 할 수있는 오류 처리기로 제어를 전달하는 것입니다.

  몇 가지 가능한 오류 :

  • 사용자 입력 오류
  • 장치 오류
  • 물리적 한계 (저장)
  • 코드 오류

1. 이상 분류

여기에 사진 설명 삽입

  • RuntimeException : 잘못된 유형 변환, 범위를 벗어난 배열 액세스 또는 널 포인터 액세스.

  • IOException : 파일 끝 이후 데이터 읽기 시도, 존재하지 않는 파일 열기 시도, 주어진 문자열을 기반으로 Class 객체 찾기 시도,이 문자열이 나타내는 클래스가 존재하지 않습니다.

  • 확인 된 예외 : IOException, 컴파일러는 확인 된 모든 예외에 대해 예외 처리기가 제공되는지 여부를 확인합니다.

  • 확인되지 않은 예외 : 오류 및 RuntimeException

2. 확인 된 예외 선언

  메서드는 헤더에 가능한 모든 예외를 선언해야합니다.

	public f(String name) throws FileNotFoundException
	{
    
    
		……
	}

  이 코드는이 메서드가 지정된 String 매개 변수를 기반으로 메서드를 호출하지만 FileNotFoundException을 throw 할 수도 있음을 나타냅니다. 이 나쁜 상황이 발생하면 메서드가 성공적으로 호출되지 않고 대신 FileNotFoundException 클래스 개체가 throw됩니다. 이 메서드가 실제로 그러한 예외 개체를 throw하는 경우 런타임 시스템은 FileNotFoundException 개체를 처리하는 방법을 알기 위해 예외 처리기를 검색하기 시작합니다.

  • 간단히 말해, 메서드는 throw 될 수있는 모든 확인 된 예외를 선언해야하며 확인되지 않은 예외는 제어 할 수 없거나 (오류) 피해야합니다 (RuftimeException). 즉, Error 및 RuntimeException에 대해 예외를 throw 할 필요가 없지만 가능한 모든 IOException 예외를 고려해야합니다.
  • 슈퍼 클래스의 메서드가 서브 클래스에서 재정의되는 경우, 서브 클래스 메서드에서 선언 된 확인 된 예외는 슈퍼 클래스 메서드에서 선언 된 예외보다 더 일반적 일 수 없습니다 (즉, 더 구체적인 예외가 서브 클래스 메서드에서 throw 될 수 있습니다. t는 모든 예외를 던집니다). 특히 슈퍼 클래스 메서드가 확인 된 예외를 throw하지 않는 경우 하위 클래스는 확인 된 예외를 throw 할 수 없지만 메서드 코드에 나타나는 모든 확인 된 예외를 포착해야합니다.

3. 예외를 던지는 방법

  • 단계 : 적합한 예외 클래스를 찾고,이 클래스의 객체를 생성하고, 객체를 던집니다.
String readData(Scanner in)throws EOFException
{
    
    
	...
	while(...)
	{
    
    
		if(!in.hasNext())
		{
    
    
			if (n <len))
			{
    
    
				String gripe="Content-length:"+len+",Received:"+n;
				throw new EOFException(gripe);//抛出异常
			}
			
		}
		...
	}
	return s;
}

  메서드에서 예외가 발생하면 메서드는 호출자에게 반환 할 수 없습니다. 즉, 반환되는 기본값이나 오류 코드에 대해 걱정하지 마십시오.

4. 예외 클래스 만들기

  Exception에서 파생 된 클래스 또는 Exception 하위 클래스에서 파생 된 클래스를 정의하기 만하면됩니다. 예를 들어, IOException에서 파생 된 클래스를 정의하십시오. 전통적으로 정의 된 클래스는 두 개의 생성자를 포함해야합니다. 하나는 기본 생성자이고 다른 하나는 자세한 설명 정보가있는 생성자입니다 (수퍼 클래스 Throwable의 toString 메서드는 디버깅에 매우 유용한 이러한 세부 정보를 출력합니다).

둘째, 예외 잡기

  예외가 발생했을 때 예외가 발견되지 않으면 프로그램은 실행을 종료하고 예외 유형 및 스택 내용을 포함하여 콘솔에 예외 정보를 출력합니다.

  다음은 예외를 처리하는 두 가지 방법입니다.

  • 첫 번째 : 예외를 처리하는 방법을 모르는 경우 예외를 호출자에게 전달합니다.
	String readData(Scanner in)throws EOFException
	{
    
    
		...
		while(...)
		{
    
    
			if(!in.hasNext())
			{
    
    
				if (n <len))
				{
    
    
					String gripe="Content-length:"+len+",Received:"+n;
					throw new EOFException(gripe);//抛出异常
				}
				
			}
			...
		}
		return s;
	}
  • 두 번째 유형 : 처리 방법을 안다면 직접 처리 할 수 ​​있습니다.
	public void read(String filename)
	{
    
    
		try
		{
    
    
			InputStream in= new FileInputStream(filename));
			int b;
			while((b =in.read())!=-1)
			{
    
    
				process input
			}
		}
		catch (IOException exception)
		{
    
    
			exception.printStackTrace();
		}
	}

  Java API 문서를주의 깊게 읽고 각 메소드가 어떤 종류의 예외를 던질 수 있는지 파악한 다음이를 직접 처리할지 아니면 throws 목록에 추가할지 결정하십시오. 후자의 경우 망설 일 필요가 없습니다. 예외를 억제하는 것보다 처리를 위해 유능한 프로세서에 직접 예외를 전달하는 것이 좋습니다.

  그러나 던지기 사용에는 제한이 있습니다. 앞서 언급했듯이 슈퍼 클래스를 다루는 메서드를 작성하고이 메서드가 예외를 throw하지 않는 경우이 메서드는 메서드 코드에 나타나는 모든 확인 된 예외를 포착해야합니다. 슈퍼 클래스 메서드에 나열된 예외 클래스의 범위를 벗어나는 하위 클래스의 throws 지정자에 나타날 수 없습니다.

1. 여러 예외 포착

  여러 catch 절을 사용하여 :

	try
	{
    
    
		...
	}
	catch()
	{
    
    
		...
	}
	catch()
	{
    
    
		...
	}
	catch()
	{
    
    
		...
	}
	e.getMessage();//获得更详细的错误信息
	e.getClass().getName();//得到异常的实际类型

  동일한 작업을 가진 Catch 절을 결합 할 수 있지만 예외 유형간에 하위 클래스 관계가있을 수 없으며 예외 변수는 암시 적으로 최종 변수입니다.

	try
	{
    
    
		...
	}
	catch(FileNotFoundException|UnknownHostException e)
	{
    
    
		...
	}
	catch()
	{
    
    
		...
	}
	catch()
	{
    
    
		...
	}

2. 예외와 예외 체인을 다시 던집니다.

	try
	{
    
    
		...
	}
	catch(SQLException e)
	{
    
    
		Throwable se = new ServletException("database error"); 
		se.initCause(e); 
		throw se;
	}

  예외가 발견되면 다음 문을 사용하여 원래 예외를 검색 할 수 있습니다.

	Throwable e = se.getCause();

  때로는 예외를 기록하고 변경하지 않고 다시 던지기를 원할 수 있습니다.

	try
	 {
    
    
	 }
	catch(Exception e)
	{
    
    
		logger.log(level,message,e); 
		throw e;
	}

3.finally 절

  코드에서 예외가 발생하면 메서드의 나머지 코드 처리가 종료되고이 메서드의 실행이 종료됩니다. 방법이 일부 지역 자원을 획득하고 방법 만 알고 있고 이러한 자원을 방법을 종료하기 전에 재활용해야하는 경우 자원 재활용 문제가 발생합니다. 이 문제를 해결하려면 finally 절을 사용하십시오.

  예외 발생 여부에 관계없이 finally 절의 코드가 실행됩니다.

	try
	{
    
    
		...
	}
	catch()
	{
    
    
		...
	}
	finally
	{
    
    
		...
	}

  경고 : finally 절에 return 문이 포함되어 있으면 예기치 않은 결과가 발생합니다. retur 문을 사용하여 try 블록을 종료한다고 가정합니다. 메서드가 반환되기 전에 finally 절의 내용이 실행됩니다. finally 절에도 return 문이있는 경우이 반환 값은 원래 반환 값을 덮어 씁니다.

4. 리소스가 포함 된 Try 문

	try(Scanner in= new Scanner(new FileInputStream"/usr/share/dict/words"),
	 Printwriter out = new PrintMriter("out.txt")))
	 {
    
    
		  while (in.hasNext())
		 {
    
    
		 	out.println(in.nextO.toUpperCase();
		 }
	 }

  블록이 아무리 나가더라도 안팎이 닫힙니다.

5. 스택 추적 요소 분석

  자세한 내용은 Throwable 인터페이스의 API를 참조하십시오.

추천

출처blog.csdn.net/Tracycoder/article/details/112363181