java
이 튜토리얼에서는 예제를 통해 Java assert 문(Java assertions)에 대해 알아봅니다.
자바의 어설션은 우리가 사실이라고 가정하는 코드를 테스트하여 버그를 감지하는 데 도움이 됩니다.
어설션은 assert
을 사용하여 만들어집니다. 키워드.
구문은 다음과 같습니다.
assert condition;
여기 condition
프로그램이 실행될 때 참이라고 가정하는 부울 표현식입니다.
기본적으로 어설션은 비활성화되어 런타임에 무시됩니다.
주장을 활성화하기 위해 다음을 사용합니다:
java -ea:arguments
또는
java -enableassertions:arguments
어설션이 활성화되고 조건이 true
인 경우 , 프로그램이 정상적으로 실행됩니다.
그러나 조건이 false
로 평가되는 경우 어설션이 활성화된 동안 JVM은 AssertionError
를 발생시킵니다. , 프로그램이 즉시 중지됩니다.
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length == 2;
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
출력
There are 3 weekends in a week
이 프로그램에는 컴파일 오류가 없고 기본적으로 어설션이 비활성화되어 있기 때문에 위의 출력을 얻습니다.
어설션을 활성화한 후 다음과 같은 출력을 얻습니다.
Exception in thread "main" java.lang.AssertionError<시간>
assert condition : expression;
이 형식의 주장문에서 표현식은 AssertionError
의 생성자에 전달됩니다. 물체. 이 표현식에는 조건이 false
인 경우 오류의 세부사항 메시지로 표시되는 값이 있습니다. .
상세 메시지는 문제 디버깅에 도움이 되도록 어설션 실패 정보를 캡처하고 전송하는 데 사용됩니다.
<시간>
class Main {
public static void main(String args[]) {
String[] weekends = {"Friday", "Saturday", "Sunday"};
assert weekends.length==2 : "There are only 2 weekends in a week";
System.out.println("There are " + weekends.length + " weekends in a week");
}
}
출력
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
위의 예에서 볼 수 있듯이 표현식은 AssertionError
의 생성자에 전달됩니다. 물체. 가정이 false
인 경우 어설션이 활성화되면 적절한 메시지와 함께 예외가 발생합니다.
이 메시지는 어설션 실패의 원인이 된 오류를 진단하고 수정하는 데 도움이 됩니다.
<시간>어설션 명령줄 스위치에 인수를 제공하지 않으면
java -ea
이렇게 하면 시스템 클래스를 제외한 모든 클래스에서 어설션이 활성화됩니다.
또한 인수를 사용하여 특정 클래스 및 패키지에 대해 어설션을 활성화할 수 있습니다. 이러한 명령줄 스위치에 제공할 수 있는 인수는 다음과 같습니다.
클래스 이름에서 어설션 사용
프로그램 Main의 모든 클래스에 대해 어설션을 활성화하려면
java -ea Main
하나의 클래스만 활성화하려면
java -ea:AnimalClass Main
이렇게 하면 AnimalClass
에서만 어설션이 활성화됩니다. Main
프로그램.
패키지 이름에 어설션 사용
패키지 com.animal
에 대한 어설션을 활성화하려면 및 하위 패키지만,
java -ea:com.animal... Main
이름 없는 패키지에서 어설션 사용
현재 작업 디렉토리에서 이름 없는 패키지(패키지 문을 사용하지 않을 때)에서 어설션을 활성화하려면
java -ea:... Main
시스템 클래스에서 어설션 사용
시스템 클래스에서 어설션을 활성화하기 위해 다른 명령줄 스위치를 사용합니다.
java -esa:arguments
또는
java -enablesystemassertions:arguments
이러한 스위치에 제공할 수 있는 인수는 동일합니다.
<시간>주장을 비활성화하려면 다음을 사용합니다.
java -da arguments
또는
java -disableassertions arguments
시스템 클래스에서 어설션을 비활성화하려면 다음을 사용합니다.
java -dsa:arguments
또는
java -disablesystemassertions:arguments
주장을 비활성화하는 동안 전달할 수 있는 인수는 활성화하는 동안과 동일합니다.
<시간>도달할 수 없는 코드는 프로그램을 실행하려고 할 때 실행되지 않는 코드입니다. 어설션을 사용하여 연결할 수 없는 코드가 실제로 연결할 수 없는지 확인합니다.
예를 들어보겠습니다.
void unreachableCodeMethod() {
System.out.println("Reachable code");
return;
// Unreachable code
System.out.println("Unreachable code");
assert false;
}
기본 케이스가 없는 switch 문의 다른 예를 들어 보겠습니다.
switch (dayOfWeek) {
case "Sunday":
System.out.println("It’s Sunday!");
break;
case "Monday":
System.out.println("It’s Monday!");
break;
case "Tuesday":
System.out.println("It’s Tuesday!");
break;
case "Wednesday":
System.out.println("It’s Wednesday!");
break;
case "Thursday":
System.out.println("It’s Thursday!");
break;
case "Friday":
System.out.println("It’s Friday!");
break;
case "Saturday":
System.out.println("It’s Saturday!");
break;
}
위의 switch 문은 요일이 위의 7개 값 중 하나만 될 수 있음을 나타냅니다. 기본 케이스가 없다는 것은 프로그래머가 이러한 케이스 중 하나가 항상 실행될 것이라고 믿는다는 것을 의미합니다.
그러나 가정이 실제로 거짓인 경우 아직 고려되지 않은 경우가 있을 수 있습니다.
이 가정은 어설션을 사용하여 기본 스위치 케이스에 도달하지 않았는지 확인해야 합니다.
default:
assert false: dayofWeek + " is invalid day";
dayOfWeek인 경우 유효한 날짜가 아닌 다른 값이 있습니다. AssertionError
던져집니다.
기본 가정을 문서화하기 위해 많은 프로그래머가 주석을 사용합니다. 예를 들어보겠습니다.
if (i % 2 == 0) {
...
} else { // We know (i % 2 == 1)
...
}
대신 주장을 사용하십시오.
댓글은 프로그램이 성장함에 따라 오래되고 동기화되지 않을 수 있습니다. 그러나 assert
을 업데이트해야 합니다. 진술; 그렇지 않으면 유효한 조건에서도 실패할 수 있습니다.
if (i % 2 == 0) {
...
} else {
assert i % 2 == 1 : i;
...
}
<시간> 공개 메서드의 인수는 사용자가 제공할 수 있습니다.
따라서 이러한 인수를 확인하는 데 어설션이 사용되면 조건이 실패하고 AssertionError
이 될 수 있습니다. .
어설션을 사용하는 대신 적절한 런타임 예외가 발생하고 이러한 예외를 처리하도록 하십시오.
<시간>어설션 조건에서 나중에 프로그램 작업에 영향을 줄 수 있는 메서드를 호출하거나 예외를 평가하지 마십시오.
평일 목록의 예를 들어보겠습니다. 한 주의 모든 요일 이름을 포함합니다.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
assert weekdays.removeAll(weekends);
여기에서 Saturday
요소를 제거하려고 합니다. 및 Sunday
ArrayList 평일에서 .
어설션이 활성화되면 프로그램이 제대로 작동합니다. 그러나 어설션이 비활성화된 경우 목록의 요소는 제거되지 않습니다. 이로 인해 프로그램이 실패할 수 있습니다.
대신 결과를 변수에 할당한 다음 해당 변수를 어설션에 사용하십시오.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ));
ArrayList<String> weekends= new ArrayList<>(Arrays.asList("Sunday", "Saturday" ));
boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;
이러한 방식으로 모든 주말 평일에서 삭제됩니다. 어설션이 활성화되거나 비활성화되는지 여부에 관계없이. 따라서 향후 프로그램 운영에 영향을 미치지 않습니다.
java
자바 ArrayDeque 이 자습서에서는 예제를 통해 ArrayDeque 클래스와 해당 메서드에 대해 알아봅니다. 또한 배열 deque를 사용하여 스택을 구현하는 방법을 배웁니다. 자바에서는 ArrayDeque를 사용할 수 있습니다. 배열을 사용하여 queue 및 deque 데이터 구조를 구현하는 클래스입니다. ArrayDeque에 의해 구현된 인터페이스 ArrayDeque 클래스는 다음 두 인터페이스를 구현합니다. 자바 대기열 인터페이스 자바 데크 인터페이스 ArrayDeque 생성 배열 데크를 생성하려면 jav
자바 ArrayBlockingQueue 이 자습서에서는 예제를 통해 ArrayBlockingQueue 클래스와 해당 메서드에 대해 알아봅니다. ArrayBlockingQueue Java Collections 프레임워크의 클래스는 배열을 사용하여 차단 대기열 구현을 제공합니다. Java BlockingQueue 인터페이스를 구현합니다. ArrayBlockingQueue 생성 배열 차단 대기열을 생성하려면 java.util.concurrent.ArrayBlockingQueue를 가져와야 합니다. 패키지. 패키지를 가져온