当前位置: 首页 > 知识库问答 >
问题:

运行接口时线程错误异常

赵飞雨
2023-03-14

我已经编写了一段代码,其中我制作了一个接口和一个实现该接口的类。现在,当我运行代码时,我给了我自己2个选项,即1输入字符串,2退出。现在,当我运行代码时,如果我选择1,它会让我放入字符串,但在此之后,当我按0时,它会给我错误:Exception in thread“main”java.lang。有人能帮我找出我在这里遗漏了什么吗?下面是代码

import java.util.ArrayList;
import java.util.List;

public interface ITimsSaveable {

    List<String> write();  // this will save the data;
    void read (List<String> savedValues);  //this will print the data

}


import java.util.ArrayList;
import java.util.List;

public class TimsPlayers implements ITimsSaveable {
    private String name;
    private int hitPoints;
    private int strength;
    private String weapon;

    public TimsPlayers(String name, int hitPoints, int strength) {
        this.name = name;
        this.hitPoints = hitPoints;
        this.strength = strength;
        this.weapon = "Sword";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getHitPoints() {
        return hitPoints;
    }

    public void setHitPoints(int hitPoints) {
        this.hitPoints = hitPoints;
    }

    public int getStrength() {
        return strength;
    }

    public void setStrength(int strength) {
        this.strength = strength;
    }

    public String getWeapon() {
        return weapon;
    }

    public void setWeapon(String weapon) {
        this.weapon = weapon;
    }
    //now go to generate > to string method

    @Override
    public String toString() {
        return "TimsPlayers{" +
                "name='" + name + '\'' +
                ", hitPoints=" + hitPoints +
                ", strength=" + strength +
                ", weapon='" + weapon + '\'' +
                '}';
    }
    //now let us create stubs, i.e. the empty methods from interface

    @Override
    public List<String> write() {
        List<String > values = new ArrayList<String >();
        values.add(0,this.name);
        values.add(1,""+this.hitPoints); //"" is quick trick to convert int to String
        values.add(2,""+this.strength);
        values.add(3,this.weapon);
        return values;
    }

    @Override
    public void read(List<String> savedValues) {
        if ((savedValues != null) && (savedValues.size() > 0)) {
           this.name = savedValues.get(0);
           this.hitPoints = Integer.parseInt(savedValues.get(1));
           this.strength = Integer.parseInt(savedValues.get(2));
           this.weapon = savedValues.get(3);
        }
        // now let us go back to our main class
    }
}


public class Main {

    public static void main(String[] args) {

    TimsPlayers tim = new TimsPlayers("Tim",10,15);
        System.out.println(tim.toString());
        saveObject(tim);

        tim.setHitPoints(8);
        System.out.println(tim);
        tim.setWeapon("Stormbringer");
        saveObject(tim);
        loadObject(tim);
        System.out.println(tim);

    }
    public static ArrayList<String> readValues() {
        ArrayList<String> values = new ArrayList<String>();

        Scanner scanner = new Scanner(System.in);
        boolean quit = false;
        int index = 0;
        System.out.println("Choose\n" +
                "1 to enter a string\n" +
                "0 to quit");

        while (!quit) {
            System.out.print("Choose an option: ");
            int choice = scanner.nextInt();
            scanner.nextLine();
            switch (choice) {
                case 0:
                    quit = true;
                    break;
                case 1:
                    System.out.print("Enter a string: ");
                    String stringInput = scanner.nextLine();
                    values.add(index, stringInput);
                    index++;
                    break;
            }
        }
        return values;
    }

    public static void saveObject(ITimsSaveable objectToSave) { //ITims is the interface that is being implemented by the player
    

//class,so we can use ITims as object type
    for (int i = 0; i < objectToSave.write().size(); i++) {
        System.out.println("Saving " + objectToSave.write().get(i) + " to storage device");
    }
    }
        public static void loadObject (ITimsSaveable objectToLoad) {
            ArrayList<String > values = readValues();
            objectToLoad.read(values);
    
    }
    }

StackTrace:

线程“main”java.lang.indexoutofboundsexception:在java.base/jdk.internal.util.preconditions.outofbounds(preconditions.java:64),在java.base/jdk.internal.util.preconditions.outofboundscheckindex(preconditions.java:70),在java.base/jdk.internal.util.preconditions.checkindex(preconditions.java:248),在.timsplayers.read(timsplayers.java:77)在org.mm.sandbox.so.main.loadObject(main.java:62)在org.mm.sandbox.so.main.main(main.java:17)

共有1个答案

谈琛
2023-03-14

这种方法

@Override
public void read(List<String> savedValues) {
    if ((savedValues != null) && (savedValues.size() > 0)) {
        this.name = savedValues.get(0);
        this.hitPoints = Integer.parseInt(savedValues.get(1));
        this.strength = Integer.parseInt(savedValues.get(2));
        this.weapon = savedValues.get(3);
    }
    // now let us go back to our main class
}

希望savedvalues完全填充,即包含4个元素--name、HP、strongth和武器。您执行savedvalues.size()>0,但这并不意味着您不只是输入了一个必需的,然后就停止了,它仍然试图访问一个不存在的元素--th.hitpoints=integer.parseint(Savedvalues.get(1));

 类似资料:
  • 我很难理解这个代码有什么问题。Dr.Java一切都很好,但是在另一个名为edhesive的代码运行平台上(我就是在这个平台上被分配这个项目的),它给我一个错误。我已经检查了所有我认为出错的地方,但仍然不知道哪里出了问题。 在edhesive上运行后,我得到了这个错误 有人能帮帮我吗?

  • 我在尝试运行程序时出现以下错误。这实际上是Hackerrank“第六天让我们回顾”挑战的提交。 线程“main”java中出现异常。util。java的NoTouchElementException。util。扫描仪。throwFor(Scanner.java:862)访问java。util。扫描仪。下一步(Scanner.java:1371)是解决方案。main(Solution.java:10

  • 问题内容: 我正在尝试使用其他EditText上传照片。我从一个在线示例中获取了示例代码,并对其进行了少量编辑,但我收到此错误: 我的Android代码: 请告诉我这里是什么问题,我该如何解决呢?预先感谢我知道,常见的答案是我需要从UI线程调用Toast.makeText(…):很抱歉,因为我很新任何人都介意对此进行更详细的解释 问题答案: 可能由于此行而出现错误 里面。必须显示在UIThread

  • 我不明白为什么一个实现可运行接口的线程子类不强迫我覆盖run方法。基本上,当我创建实现Runnable的简单类时,它强迫我覆盖run方法。但是当我把普通类变成线程的子类时,它不再强迫我覆盖这个类了。这背后的逻辑是什么?

  • 问题内容: 我是mysql和jdbc的新手,但出现此标题错误。我整天都在搜索,找不到适合我的解决方案。 我尝试过的操作:卸载/重新安装mysql,将mysql-connector- java-5.1.25-bin.jar和ojdbc7.jar复制粘贴到与我要运行的.class文件相同的位置,然后将该程序重建在其他目录中,可能还有其他几件事。 我正在使用notepad ++进行编码,并使用Windo

  • 我正在尝试仅使用本地依赖项编译和运行java grpc客户端,但出现以下错误: 这是我的gradle文件: 程序将编译,但不运行。我已经从protos生成了我的java文件,并验证了我是否使用了正确的protoc和protoc gen grpc java与我正在使用的jar库相对应。非常感谢您的帮助。