지식 대 기술
대학은 우리에게 이론과 실제 사이에 큰 차이가 없다고 가르쳤습니다. 글쎄, 확실히 당신은 그것이 동일하지 않다는 것을 이해합니다. 그러나 핵심적인 차이점은 보이지 않습니다. 그러나 하나가 있습니다. 대부분의 사람들은 "I know"와 "I can" 사이에 등호를 넣습니다. 당신은? 몇 가지 예를 들면 어떻습니까?- 흡연이 나에게 나쁘다는 것을 알지만 나는 담배를 피운다.
- 패스트푸드가 나에게 좋지 않다는 것을 알지만 먹습니다.
- 교통법규는 알지만 운전을 못해요.
- 나는 조깅이 나에게 좋다는 것을 알지만 아침에 조깅을 하지 않는다.
당신은 새로운 수준에 도달했습니다
레벨 9
1 Risha, 스택 추적
- 여기요! 오늘은 스택 트레이스가 무엇인지 알려드리겠습니다. 그러나 먼저 스택이 무엇인지 설명하겠습니다. - 서류 더미를 상상해보십시오 - 특정 사무원에 대한 과제. 새 과제를 스택 맨 위에 놓을 수 있으며 스택 맨 위에서 과제를 가져옵니다. 따라서 과제는 선착순이 아닙니다. 점원이 마지막으로 오는 과제를 맡을 때마다. 이러한 수집 구조를 스택이라고 합니다 . - Java에는 특별한 컬렉션인 Stack이 있습니다. 이 컬렉션에는 «요소 추가» 및 «요소 가져오기(가져오기)» 메서드가 있습니다. 이미 알고 있듯이 마지막으로 추가된 요소가 먼저 사용됩니다. - 흠. 어렵지 않은 것 같아요. - 괜찮은. 그런 다음 스택 추적 이 무엇인지 설명하겠습니다.이다. - Java에서 함수 А가 함수 B를 호출 하고 후자는 함수 C를 호출 하고 차례로 함수 D를 호출한다고 상상해 보십시오 . 따라서 함수 B를 종료하려면 먼저 함수 C를 종료해야 하며 그렇게 하려면 함수 D를 종료해야 합니다 . 이것은 스택과 매우 유사합니다. - 유사점은 무엇입니까? - 스택에서 특정 과제에 도달하려면 맨 위에 놓인 과제도 모두 완료해야 합니다. - 글쎄요, 일종의 비유인데 제가 모든 것을 제대로 이해했는지 잘 모르겠습니다. - 이봐. Java에서 스택은 요소 집합입니다. 그것은 스택에 있는 종이 시트와 같습니다. 위에서 세 번째를 가져오려면 두 번째 시트를 가져와야 하지만 그 전에 첫 번째 시트를 가져와야 합니다. 시트는 항상 넣고 빼면 되지만 시트는 맨 위에만 놓고 맨 위에서만 가져갈 수 있습니다. 함수 호출에도 동일하게 적용됩니다. 함수 А 는 함수 B를 호출 하고 후자는 함수 C를 호출합니다 . А 를 종료하려면 먼저 B를 종료해야 하며 이를 위해서는 C를 종료해야 합니다 . - 잠깐 기다려요. 제대로 된 경우 전체 스택은 «스택에 넣은 마지막 시트만 가져올 수 있습니다» 및 «먼저 마지막으로 호출된 함수가 종료되어야 합니다»로 나타납니다. 그렇습니까? - 예. 따라서 함수 호출의 순서는 «함수 호출 스택» 또는 단순히 «호출 스택»입니다. last 호출된 함수가 먼저 종료되어야 합니다. 예를 살펴보겠습니다. - 좋습니다. 함수 호출로 모든 것이 명확합니다. 하지만 이 StackTraceElement 는 무엇입니까 ? - JVM(Java Virtual Machine)은 모든 함수 호출을 기록합니다. 이를 위해 특별한 컬렉션인 스택이 있습니다. 한 함수가 다른 함수를 호출하면 JVM은 새 요소 StackTraceElement를 이 스택에 배치합니다. 함수가 끝나면 요소가 스택에서 삭제됩니다. 따라서 이 스택은 항상 «함수 호출 스택»의 현재 상태에 대한 최신 정보를 저장합니다. - 모든 StackTraceElement호출된 메서드에 대한 정보를 포함합니다. 따라서 getMethodName을 사용하여 이 메서드의 이름을 가져올 수 있습니다 . - 위의 예는 다음을 보여줍니다.- «호출 스택» 가져오기:
- for-each 루프를 사용하여 배열을 반복합니다 . 잊지 않으셨으면 좋겠습니다.
- 메서드 이름을 System.out 에 인쇄합니다 .
2 Diego, 스택 트레이스 표시 작업
- 이봐, 아미고! 다음은 스택 추적을 화면에 표시하는 작은 작업입니다.작업 | |
---|---|
1 | 각 메서드는 StackTrace를 반환해야 합니다. 서로를 호출하는 5개의 메서드를 작성합니다. 각 메서드는 StackTrace를 반환해야 합니다. |
2 | StackTrace 다시 서로를 호출하는 5개의 메서드를 작성합니다. 각 메서드는 호출자 메서드의 이름을 반환해야 합니다. StackTrace를 사용하여 호출자 메서드를 얻을 수 있습니다. |
삼 | 이 메서드는 서로 호출하는 5개의 메서드 작성 에서 이 메서드가 호출된 코드의 줄 번호를 반환해야 합니다 . 각 메서드는 이 메서드가 호출된 코드의 줄 번호를 반환해야 합니다. element.getLineNumber() 함수를 사용하십시오 . |
4 | 10번 호출의 스택 추적 10번 호출의 스택 추적을 가져오는 코드를 작성합니다. |
5 | 메서드는 결과를 반환해야 합니다. 스택 추적 깊이 스택 추적 깊이를 표시하고 반환하는 메서드를 작성합니다. 스택 추적 깊이는 해당 메서드의 수(목록의 요소 수)입니다. |
3 Elly, 오류 및 예외
- 이봐, 아미고! 오늘 우리는 매우 흥미로운 교훈을 가지고 있습니다. 예외 사항에 대해 알려드리겠습니다. 예외는 프로그램의 오류를 제어하는 특별한 메커니즘입니다. 다음은 프로그램에서 발생할 수 있는 오류의 몇 가지 예입니다.- 프로그램이 전체 디스크에 파일 쓰기를 시도합니다.
- 프로그램은 null 참조를 저장하는 변수의 메서드를 호출하려고 시도합니다.
- 프로그램은 숫자를 0으로 나누려고 시도합니다.
- 오류가 발생하면 JVM(Java Virtual Machine)은 오류에 대한 모든 정보를 포함하는 특수 개체(예외)를 생성합니다. 다른 오류의 경우 다른 예외가 있습니다.
- 그런 다음 이 예외는 프로그램이 현재 함수를 즉시 중단하도록 강제하고 다음 함수는 메인 메서드를 종료할 때까지 중단합니다. 그 후 프로그램이 종료됩니다. Java 개발자는 이 프로세스를 «호출 스택 롤백»이라고 합니다.
- try 블록 내에서 예외가 발생하면 이 블록의 코드는 더 이상 실행되지 않지만 블록 catch 의 실행이 시작됩니다.
- 예외가 발생하지 않으면 try 블록은 끝까지 실행되고 catch 는 실행되지 않습니다 .
4 Elly, RuntimeException, throws
- 오늘은 다른 주제를 꺼내기로 했습니다. Java에서 모든 예외는 controlled/checked 및 uncontrolled/unchecked 의 두 가지 유형으로 나뉩니다 . 체크된 예외는 포착 되어야 하고 , 체크되지 않은 예외는 포착될 수 있지만 필수는 아닙니다 . - 의도적으로 코드에서 예외를 던질 수 있습니까? - 코드에서 직접 예외를 던질 수 있습니다. 자신만의 예외를 작성할 수도 있습니다. 그러나 우리는 나중에 이 구멍에 깊이 들어갈 것입니다. 이제 JVM(Java Virtual Machine)에서 발생하는 예외를 처리하는 방법을 알아보겠습니다. - 좋아요. - 예외 ClassNotFoundException 및 FileNotFoundException 인 경우메서드에서 발생(나타남)하는 경우 프로그래머는 메서드 서명(메서드 헤더)에 이를 지정해야 합니다. 이러한 예외가 확인됩니다. 일반적으로 다음과 같이 표시됩니다. - 따라서 쉼표로 구분된 예외를 던지고 나열합니다. 오른쪽? 그렇습니까? - 예. 그러나 또 다른 흥미로운 점이 있습니다. 아래 예제가 컴파일되기 위해서는 method1()을 호출하는 메서드가 이러한 예외를 포착 하거나 앞으로 던져야 합니다 . 확인된 예외를 앞으로 던지려면 메서드의 헤더에 지정해야 합니다 . - 다시 한 번, 기본 메서드에서 헤더 구문에 FileNotFoundException을 throw하는 메서드를 호출하려는 경우 …그런 다음 다음 두 가지 중 하나를 수행해야 합니다.- FileNotFoundException , … 위험한 메서드를 호출하는 코드를 try-catch 블록
으로 래핑해야 합니다. - FileNotFoundException , …
5 Risha, 호출 스택 롤링, 예외에서 수행하는 방법
- 예외가 어떻게 작동하는지에 대해 조금 더 말씀드리고 싶습니다. 아래 예는 다음을 설명합니다. - 이해가 안 됩니다. - 좋아요. 무슨 일이 일어나고 있는지 설명하겠습니다. - 왼쪽 예제에서는 여러 메서드를 연쇄적으로 호출합니다. method2() 에서 우리는 특별히 예외를 생성하고 발생시킵니다(오류를 시작하기 위해). - 오른쪽의 예는 어떤 일이 발생하는지 보여줍니다. method2() 를 보십시오 . 이것이 바로 예외의 생성이 변환되는 것입니다. RuntimeException 유형 의 개체를 생성하고 특수 변수 예외 에 저장 하고 즉시 메서드를 종료합니다 – return . - method1 에서 method2 를 호출한 후 검사가 있습니다.예외가 있는지 없는지; 예외가 있으면 method1이 즉시 종료됩니다. 이 확인은 각(!) Java 메서드를 호출한 후 암시적으로 수행됩니다. - 우와! - 정확히. -메서드 오른쪽 열에 try-catch 블록 에서 예외가 잡히면 어떻게 되는지 썼습니다 . 예외가 없으면 코드는 계획대로 계속 실행됩니다. catch 에 지정된 유형의 예외가 있으면 처리합니다. - throw 와 instanceof는 무엇을 의미합니까? - 왼쪽의 마지막 줄을 보면 새로운 RuntimeException(s)이 발생합니다.. 이런 식으로 우리는 예외를 만들고 던집니다. 이것은 단지 예일 뿐입니다. 우리는 지금까지 그것을 하지 않을 것입니다. - 오른쪽 블록에서 « а instanceof B » 명령을 사용하여 객체 a가 B 유형인지 확인합니다 . 즉, 변수 exception에 저장된 객체가 RuntimeException 유형인지 여부입니다 . 논리적인 표현입니다. - 음, 조금 더 명확해지고 있습니다.6 디에고, 예외 캐치 태스크
- 이봐! 디에고 삼촌은 당신을 위해 낚시에 대한 몇 가지 작업을 가져왔습니다. 행운을 빌어 요. 필요하실 것 같아요. ㅎ. - 이봐, 아미고! 다음은 몇 가지 흥미로운 예외 catch 작업입니다.잡기 작업 | |
---|---|
1 | 1. 숫자로 연산할 때의 예외 코드를 실행할 때 발생하는 예외를 잡아라: int a = 42 / 0; 유형을 지정하여 예외를 화면에 표시합니다. |
2 | 2. 문자열로 동작할 때의 예외 코드를 실행할 때 발생하는 예외를 잡아라: String s = null; String m = s.toLowerCase(); 유형을 지정하여 화면에 예외를 표시합니다. |
삼 | 3. 배열로 작동할 때의 예외 코드를 실행할 때 발생하는 예외를 포착합니다. int[] m = new int[2]; m[8] = 5; 유형을 지정하여 화면에 예외를 표시합니다. |
4 | 4. 목록 컬렉션으로 작업 시 예외 코드 실행 시 발생하는 예외를 포착합니다. ArrayList<String> list = new ArrayList<String>(); 문자열 s = list.get(18); 유형을 지정하여 화면에 예외를 표시합니다. |
5 | 5. Map 컬렉션으로 작업 시 예외 코드 실행 시 발생하는 예외를 포착합니다. HashMap<String, String> map = new HashMap<String, String>(null); map.put(null, null); map.remove(null); 유형을 지정하여 화면에 예외를 표시합니다. |
7 Risha, 다중 캐치가 작동하는 방식
- 이제 좀 더 흥미로운 강의가 있습니다. 나는 가르치는 것을 너무 좋아합니다. - 다중 캐치가 어떻게 작동하는지 알려주고 싶습니다 . 실제로는 매우 간단합니다. try 블록에서 예외가 발생하면 프로그램 실행이 첫 번째 catch 로 전송됩니다 . - 블록 catch의 괄호 안에 지정된 유형이 예외 객체의 유형과 동일한 경우 {} 내에서 코드 실행이 시작됩니다. 그렇지 않으면 다음 catch 로 이동합니다 . 그곳에서 확인이 반복됩니다. - 더 이상 catch 블록이 없지만 예외가 catch되지 않은 경우 앞으로 던져지고 현재 메서드가 중단됩니다. - 알겠어요. 해당 유형이 예외 유형과 일치하는 catch가 실행됩니다. - 네, 그러죠. 실제로는 좀 더 복잡합니다. 요점은 클래스가 서로 상속될 수 있다는 것입니다. «Cow» 클래스가 «Animal» 클래스에서 상속된 경우 «Cow» 유형의 개체는 «Cow» 유형의 변수뿐만 아니라 «Animal» 유형의 변수에도 저장될 수 있습니다. . - 그래서? - 모든 예외는 클래스 Exception 또는 RuntimeException ( Exception 에서도 상속됨 )에서 상속되므로 모두 catch(Exception e) 또는 catch(RuntimeException e) 명령을 사용하여 잡을 수 있습니다 . - 그래서? - 즉,첫째, catch(Exception e) 명령을 사용하여 모든 예외를 잡을 수 있습니다 . 둘째, catch 블록 의 순서가 중요합니다. 예: - 0으로 나눈 결과인 ArithmeticException이 두 번째 catch에서 포착되었습니다. - 아래 예에서 ArithmeticException은 모든 예외의 클래스가 Exception에서 상속되기 때문에 첫 번째 catch 에서 catch됩니다. 따라서 Exception은 모든 예외를 포착합니다 . - 아래 예제에서 ArithmeticException 예외는 catch되지 않고 호출 메서드로 전달됩니다. - 이제 점점 명확해지고 있습니다. 이러한 예외는 그렇게 쉽지 않습니다. - 그냥 그런 것 같습니다. 사실 자바에서 가장 간단한 것 중 하나입니다. - 기뻐해야 할지, 화를 내야 할지 애매...8 디에고, 다중 예외 catch 작업
- 이봐, 아미고! 어제 내가 술에 취해 당신의 일을 너무 복잡하게 만들었지만, 당신이 힘든 감정 없이 모두 잘 해결했으면 좋겠습니다. 그것은 당신 자신의 이익을 위한 것입니다. 여기:작업 | |
---|---|
1 | 1. 예외 Exception 에서 상속된 두 가지 예외와 RuntimeException 에서 상속된 다른 두 가지 예외를 발생시키는 메서드가 있습니다 : NullPointerException , ArithmeticException , FileNotFoundException 및 URISyntaxException . NullPointerException 및 FileNotFoundException 을 포착해야 하지만 ArithmeticException 및 URISyntaxException 은 포착하지 않아야 합니다 . 그것을하는 방법? |
2 | 2. 예외 포착 Exception 에서 순차적으로 상속되는 세 가지 예외가 있습니다 . class Exception1 extends Exception class Exception2 extends Exception1 class Exception3 extends Exception2 다음과 같은 방법이 있습니다. public static void method1() throws Exception1, Exception2, Exception3 Write a catch Exception1 , Exception2 및 Exception3 세 가지를 모두 catch하는 블록 |
삼 | 3. 선별적 예외 포착 1. BEAN.methodThrowExceptions 메소드에 의해 발생한 예외를 찾으십시오 . 2. processExceptions() 메서드는 BEAN.methodThrowExceptions 메서드를 호출 하고 예외를 처리해야 합니다. 2.1. FileSystemException 예외가 발생하면 BEAN.log 메서드를 호출하여 기록 하고 2.2를 전달합니다 . 예외 CharConversionException 또는 기타 IOException이 발생하면 BEAN.log 메소드를 호출하여 기록하십시오. 3. 2.1에서 전달하려는 예외의 클래스/유형을 추가하십시오. processExceptions() 에 메소드 서명. 4. main() 메서드에서 나머지 예외를 처리하고 기록합니다. try..catch 사용 팁: 잡고 싶지 않은 MyException 예외를 잡은 경우 다음 코드를 사용하여 앞으로 던질 수 있습니다. catch (MyException e) { throw e; } |
4 | 4. 체크 예외 잡기 processExceptions() 메서드에서 모든 체크 예외를 처리합니다 . 발생한 각 확인된 예외를 화면에 표시해야 합니다. 하나의 블록 try 만 사용할 수 있습니다 . |
5 | 5. 확인되지 않은 예외 잡기 processExceptions() 메서드에서 모든 확인되지 않은 예외를 처리합니다 . printStack() 메서드를 사용하여 발생한 각 예외의 스택 추적을 화면에 표시해야 합니다 . 하나의 블록 try 만 사용할 수 있습니다 . |
9 교수, 예외에 대한 강의
- 오늘 우리는 매우 흥미로운 주제인 예외를 가지고 있습니다. 당시 젊은 과학자들과 프로그래머들이 이 주제에 열광하던 시절… 다음은 강의노트입니다. 나는 당신이 그것을 스스로 알아낼 것이라고 생각합니다. 여기: Java 예외(Oracle 설명서) Java의 예외 처리(Java T 포인트) Java - 예외 처리(튜토리얼 포인트) 기본 Java 예외 처리10 훌리오
- 아미고, 오늘 수업 어때? 당신의 양전자 두뇌가 아직 작동하지 않았습니까? 디에고의 임무는 누구라도 지치게 하기에 충분하다. 잠시 맥주를 마시며 휴식을 취합시다. 아직도 서 있니?11 다람쥐 선장
-안녕하세요, 군인! - 좋은 아침입니다! - 멋진 소식이 있습니다. 다음은 기술을 강화하기 위한 빠른 확인입니다. 매일 하세요, 그러면 당신의 기술이 정말 빠르게 향상될 것입니다. 작업은 Intellij IDEA에서 수행하도록 특별히 설계되었습니다.Intellij Idea에서 수행할 추가 작업 | |
---|---|
1 | 1. 0으로 나누기 임의의 숫자를 0으로 나누고 나누기 결과를 화면에 표시해야 하는 public static void divisionByZero() 메서드를 만듭니다 . divisionByZero() 메서드 호출을 try..catch 로 래핑합니다 . exception.printStackTrace() 메서드를 사용하여 예외 스택 추적을 화면에 표시합니다 . |
2 | 2. 10에서 0으로 카운트다운 10에서 0으로 카운트다운하는 루프를 작성합니다. Thread.sleep(100)을 사용하여 지연을 만듭니다. sleep 호출을 try..catch 로 래핑합니다 . |
삼 | 3. 메서드를 try..catch로 래핑합니다. 키보드에서 숫자를 읽습니다. 키보드에서 숫자를 읽는 코드를 별도의 메서드 readData() 에 작성합니다 . 이 메서드의 전체 본문( 숫자가 저장될 목록 선언을 제외한 readData() 메서드 내의 전체 코드)을 try..catch 로 래핑합니다 . 사용자가 숫자를 입력하는 대신 텍스트를 입력하면 메서드는 예외를 포착하고 이전에 입력한 모든 숫자를 화면에 표시해야 합니다. 화면에 숫자를 표시합니다. 각 번호는 새 줄에 있어야 합니다. 숫자의 순서는 입력할 때와 같아야 합니다. |
4 | 4. 날짜 변환기 키보드에서 «08/18/2013» 형식의 날짜를 읽습니다. «2013년 8월 18일» 형식으로 해당 날짜를 화면에 표시합니다. Date 및 SimpleDateFormat 개체를 사용합니다 . |
5 | 5. 모음과 자음 키보드에서 줄을 읽어주는 프로그램을 작성하세요. 프로그램은 화면에 두 개의 문자열을 표시해야 합니다. 1) 첫 번째 문자열에는 모음이 포함되어야 합니다. 2) 두 번째 문자열에는 입력된 텍스트의 자음 및 구두점 문자가 포함되어야 합니다. 공백으로 문자를 구분합니다. 입력 예: Stop look listen 출력 예: oooie stplklstn |
6 | 6. 빨간모자의 이야기 1. 빨간모자, 할머니, 패티, 나무꾼, 늑대의 5가지 클래스가 있습니다. 2. 각 클래스에는 두 개의 ArrayList 유형 필드인 kill 및 ate가 있습니다. 3. 필요한 개체가 이미 생성되어 있습니다(후드, 할머니, ...). 4. "빨간 모자"의 논리를 얻기 위해 올바른 관계(누가 누구를 먹고 죽였는가)를 만드십시오. |
7 | 7. 정적 수정 이동 정적 수정자를 이동하여 코드가 컴파일되도록 합니다. |
8 | 8. 숫자 배열 목록 요소가 숫자 배열인 목록을 만듭니다. 길이가 각각 5, 2, 4, 7, 0인 5개의 객체 배열을 목록에 추가합니다. 데이터로 배열을 채우고 화면에 표시합니다. |
9 | 9. 고양이 10마리 String name 필드가 있는 Cat 클래스를 만듭니다 . Map<String, Cat> 사전을 만들고 «Name» - «Cat» 모델에 고양이 10마리를 추가합니다. 맵 에서 이름 집합을 가져오고 화면 에 집합을 표시합니다. |
보너스 작업 | |
---|---|
1 | 1. 프로그램이 컴파일 및 실행되지 않습니다. 고쳐. 작업: 프로그램은 키보드에서 두 개의 파일 이름을 읽고 첫 번째 파일을 두 번째 이름으로 지정된 위치에 복사해야 합니다. |
2 | 2. 프로그램에 새로운 기능을 추가합니다. 이전 작업: 프로그램은 키보드에서 두 개의 파일 이름을 읽고 첫 번째 파일을 두 번째 이름으로 지정된 위치에 복사해야 합니다. 새 작업: 프로그램은 키보드에서 두 개의 파일 이름을 읽고 첫 번째 파일을 두 번째 이름으로 지정된 위치에 복사해야 합니다. 지정된 이름을 가진 파일(복사할 파일)이 존재하지 않는 경우 프로그램은 «파일이 존재하지 않습니다»라는 메시지를 화면에 표시하고 파일을 읽기 전에 콘솔에서 파일 이름 읽기를 다시 시도해야 합니다. 두 번째(대상) 파일의 이름입니다. |
삼 | 3. 알고리즘 학습 및 실습. 키보드에서 단어 및 숫자 목록을 읽습니다. 단어는 오름차순으로, 숫자는 내림차순으로 화면에 표시합니다. 입력 예: Cherry 1 Bean 3 Apple 2 0 Watermelon 출력 예: Apple 3 Bean 2 Cherry 1 0 Watermelon |
GO TO FULL VERSION