English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NoSuchElementException의 원인은 무엇이고, Java에서 어떻게 고칠 수 있나요?

NoSuchElementException의 원인은 무엇이고, Java에서 어떻게 고칠 수 있나요?

예외는 프로그램 실행 중 발생하는 문제(런타임 오류)입니다. 예외가 발생하면 프로그램이 갑자기 중단되고, 예외가 생성된 라인 이후의 코드는 결코 실행되지 않습니다. 각 예외는 자신의 클래스로 표현됩니다.

NoSuchElementException의 원인

이는 실행 중 발생하는 런타임 예외입니다.

빈 객체에서 요소를 가져오려고 시도하거나, Enumeration, Iterator 또는 tokenizer의 접근자 메서드(예: next() 또는 nextElement())를 사용하여 셋, 배열 또는 다른 객체의 내용을 접근하면, 객체(셋, 배열 또는 다른 객체)의 끝에 도달한 후 다음 요소를 가져오려고 시도하면 NoSuchElementException이 생성됩니다.

예를 들어:

  • 빈 Enumeration 객체에 Enumeration 클래스의 nextElement() 메서드를 호출하거나, 현재 위치가 Enumeration의 끝에 있다면, 실행 중 NosuchElementException이 생성됩니다.

  • 빈 StringTokenizer 객체에 StringTokenizer 클래스의 nextElement()와 nextToken() 메서드를 사용하거나, 현재 위치가 StringTokenizer의 끝에 있다면, 실행 중 NosuchElementException이 생성됩니다.

  • 如果Iterator或ListIterator 클래스의 next() 메서드가空的Iterator / ListIterator上调用,或者如果当前位置在末尾,则在运行时生成Iterator / listIterator NosuchElementException。

  • 类似地,如果在空的ListIterator对象上调用ListIterator类的previous()方法,或者如果当前位置是ListIterator的开始,则在运行时会生成NosuchElementException。

示例

import java.util.StringTokenizer;
public class StringTokenizerExample{
   public static void main(String args[]) {
      String str = "Hello how are you";
      //StringTokenizer 클래스를 인스턴스화
      StringTokenizer tokenizer = new StringTokenizer(str, " ");
      //모든 토큰을 인쇄
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      System.out.println(tokenizer.nextToken());
      //Getting the next token after reaching the end
      tokenizer.nextToken();
      tokenizer.nextElement();
   }
}

运行时错误

Hello
how
are
you
Exception in thread "main" java.util.NoSuchElementException
   at java.util.StringTokenizer.nextToken(Unknown Source)
   at MyPackage.StringTokenizerExample.main(StringTokenizerExample.java:16)

处理/修复NosuchElementException

几乎所有访问器方法导致NoSuchElementException的类都包含各自的方法,以验证对象(集合,令牌生成器等)是否包含更多元素。

예를 들어-

  • Enumeration 클래스는 hasMoreElements() 메서드를 포함하고 있으며, 현재 객체가 현재 위치 이후에 더 많은 요소를 포함하고 있을 때는 이 메서드가 true를 반환합니다(그렇지 않으면 false를 반환합니다).

  • StringTokenizer 클래스는 hasMoreTokens()와 hasMoreElements() 메서드를 포함하고 있으며, 현재 객체가 현재 위치 이후에 더 많은 요소를 포함하고 있을 때는 이 메서드가 true를 반환합니다(그렇지 않으면 false를 반환합니다).

  • Iterator 클래스는 hasNext() 메서드를 포함하고 있으며, 현재 이터레이터가 현재 위치 근처에 더 많은 요소를 포함하고 있을 때는 이 메서드도 true를 반환합니다(그렇지 않으면 false를 반환합니다).

  • ListIterator 클래스는 hasPrevious() 메서드를 포함하고 있으며, 현재 이터레이터가 현재 위치 이전에 더 많은 요소를 포함하고 있을 때는 이 메서드도 true를 반환합니다(그렇지 않으면 false를 반환합니다).

while 루프에서 이 메서드를 사용하여 해당 객체가 더 많은 요소를 포함하는지 확인하고, 조건이 true 일 때만 인쇄합니다./요소에 접근합니다. 객체에 요소가 없을 때나 끝에 도달하면, 이는 접근자 메서드를 사용하여 요소에 접근하는 것을 방지할 수 있습니다.

Enumeration 클래스의 hasMoreElements() 메서드

import java.util.Enumeration;
import java.util.Vector;
public class EnumExample {
   public static void main(String args[]) {
      //벡터 인스턴스화
      Vector<Integer> vec = new Vector<Integer>( );
      //벡터를 채우기
      vec.add(1254);
      vec.add(4587);
      //Enumeration을 사용하여 요소를 가져오기
      Enumeration<Integer> en = vec.elements();
      while(en.hasMoreElements()) {
         System.out.println(en.nextElement());
      }
   }
}

출력 결과

1254
4587

StringTokenizer 클래스의 nextMoreTokens() 메서드-

import java.util.StringTokenizer;
public class StringTokenizerExample{
   public static void main(String args[]) {
      String str = "Hello how are you";
      //StringTokenizer 클래스를 인스턴스화
      StringTokenizer tokenizer = new StringTokenizer(str, " ");
      //모든 토큰을 인쇄
      while(tokenizer.hasMoreTokens()) {
         System.out.println(tokenizer.nextToken());
      }
   }
}

출력 결과

Hello
how
are
you

Iterator 클래스의 hasNext() 메서드-

import java.util.ArrayList;
import java.util.Iterator;
public class NextElementExample{
   public static void main(String args[]) {
      //ArrayList 오브젝트를 인스턴싱 중
      ArrayList<String> list = new ArrayList<String>();
      //ArrayList을 채우는 중
      list.add("apple");
      list.add("망고");
      list.add("oranges");
      //ArrayList의 이터레이터 오브젝트를 가져오는 중
      Iterator it = list.iterator();
      while(it.hasNext()) {
         System.out.println(it.next());
      }
   }
}

출력 결과

apple
망고
오렌지

ListIterator 클래스의 hasPrevious() 메서드-

import java.util.ArrayList;
import java.util.ListIterator;
public class NextElementExample{
   public static void main(String args[]) {
      //ArrayList 오브젝트를 인스턴싱 중
      ArrayList<String> list = new ArrayList<String>();
      //ArrayList을 채우는 중
      list.add("apple");
      list.add("망고");
      list.add("oranges");
      //ArrayList의 이터레이터 오브젝트를 가져오는 중
      ListIterator<String> it = list.listIterator();
      while(it.hasNext()) {
         it.next();
      }
      while(it.hasPrevious()) {
         System.out.println(it.previous());
      }
   }
}

출력 결과

오렌지
망고
apple
좋아하는 것을 추천해요