2017-09-22 10 views
4

jshell 스크립트를 작성하려고했습니다. 예외가 발생하면 jshell은 계속해서 다음 행을 실행합니다.jshell은 예외가 발생 된 후에도 내 스크립트를 계속 실행합니다. 그것을 멈추게 만드는 방법?

어떻게 스크립트를 일반적인 Java 프로그램처럼 동작하게 할 수 있습니까?

편집 : 나는 단순히 jshell SCR.jsh처럼 실행합니다.

throw new Exception() 또는 1/0을 사용하면 다음 행이 실행되지 않습니다.

스크립트는 다음과 같이 진술이 포함되어

System.out.println(1/0) 
System.out.println("foo") 
/exit 

나는 두 번째 줄에 연결할 생각했다. 그게 내가 기대 한거야. 그러나 예외가 인쇄 된 후 foo도 인쇄됩니다.

+2

이 질문은 문제의 행동을 보여주는 예제에서 도움이됩니다. –

+1

문제에 대해서는 [MCVE] (https://stackoverflow.com/help/mcve)를 보는 것이 좋습니다. – nullpointer

+1

디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 설명이없는 질문은 다른 독자에게 유용하지 않습니다. 참조 : [mcve]를 만드는 방법. '편집'링크를 사용하여 * 질문 *을 개선하십시오 - 의견을 통해 더 많은 정보를 추가하지 마십시오. 감사! – GhostCat

답변

6

jshelljshell이 이라는 목록으로 스크립트를 처리하기 때문에 예외를 throw 한 후에도 스크립트의 모든 행을 실행하는 이유는 다음과 같습니다.

모든 표현식이 스 니펫으로 허용됩니다. 이러한 과제와 메소드 호출

System.out.println("Hello world"); 
new BufferedReader(new InputStreamReader(System.in)) 
같은

1 
a 
x -> x+1 
(String s) -> s.length() 

을뿐만 아니라 부작용 식 : 이것은 상수로 부작용없이 표현 , 변수에 액세스하고, λ 식을 포함

코드 단편 중 하나라도 예외를 throw하고 나머지는 예외를 throw합니다. 나머지는 반드시 따라야합니다. Read-Eval-Print Loop (REPL) 패턴. 마찬가지로 answered yourself은 문 블록으로 코드를 변환하여 Snippet으로 표시하고 java.lang.ArithmeticException은 완료를 표시합니다.

이상적으로 이러한 문은 선언 스 니펫으로 정의되어야합니다.

선언 니펫 (ClassDeclaration, InterfaceDeclaration, MethodDeclaration 또는 FieldDeclaration)는 명시 다른 조각으로 지칭 될 수있는 이름을 소개하는 단편이다.

2

마지막으로 내가 해결 방법을 찾은 것 같아 :

{ 
    System.out.println(1/0); 
    System.out.println("foo"); 
} 
/exit 

가 지금은 익숙한 자바 코드에 더 가까이있다.

예외는 예상대로 작동 할뿐만 아니라 블록 내부에서도 세미콜론이 필요합니다.