Ошибка из цикла while, что не так с этим кодом? - PullRequest
0 голосов
/ 29 сентября 2018

Я все еще изучаю Java и работаю со строителем сцен.Каждый раз, когда я ввожу значение, которого нет на сайте, с которого он извлекает данные, я получаю эту ошибку.Я пытался решить эту проблему часами, и у меня болит голова.Когда я ввожу значение, которое присутствует на сайте, я не получаю ошибок, однако, когда я ввожу что-то в текстовое поле, которого нет на сайте, я получаю эту ошибку.

    Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Node.fireEvent(Node.java:8411)
    at com.sun.javafx.scene.control.behavior.TextFieldBehavior.fire(TextFieldBehavior.java:179)
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callAction(TextInputControlBehavior.java:178)
    at com.sun.javafx.scene.control.behavior.BehaviorBase.callActionForEvent(BehaviorBase.java:218)
    at com.sun.javafx.scene.control.behavior.TextInputControlBehavior.callActionForEvent(TextInputControlBehavior.java:127)
    at com.sun.javafx.scene.control.behavior.BehaviorBase.lambda$new$74(BehaviorBase.java:135)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$KeyHandler.process(Scene.java:3964)
    at javafx.scene.Scene$KeyHandler.access$1800(Scene.java:3910)
    at javafx.scene.Scene.impl_processKeyEvent(Scene.java:2040)
    at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2501)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:217)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:149)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$352(GlassViewEventHandler.java:248)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:247)
    at com.sun.glass.ui.View.handleKeyEvent(View.java:546)
    at com.sun.glass.ui.View.notifyKey(View.java:966)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 46 more
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -2
    at java.lang.String.substring(String.java:1967)
    at sample.testController.findID(testController.java:85)
    at sample.testController.search(testController.java:39)
    ... 56 more

Вот мой файл контроллера

    package sample;
import javafx.scene.control.Label;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.control.Button;
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

import javafx.scene.control.TextField;

public class testController {


    @FXML
    private Button Hiscores;

    @FXML
    private TextField geSearch;

    @FXML
    private Label Price;

    Items item = new Items();

    public void search() throws MalformedURLException, IOException {
        BufferedReader br = null;

        String itemName = geSearch.getText();
        item.setName(itemName);
        item.test();
        findID();

        System.out.println("MAde it");
        System.out.println(item.getId());
        if(item.getId().equalsIgnoreCase(""))
            Price.setText("Item not found");
        else {
            String u = "http://services.runescape.com/m=itemdb_oldschool/api/catalogue/detail.json?item=" + item.getId();
            URL url = new URL(u);
            br = new BufferedReader(new InputStreamReader(url.openStream()));

            String line = "";

            line = br.readLine();
            String lineSplit;

            String result = line.substring(line.indexOf(",\"price\":") + 9, line.indexOf("},\"today\""));
            if (result.contains("\"")) {
                result = result.substring(1, result.length() - 1);
            }
            Price.setText(result);
        }
    }


    public void findID() throws IOException{

        BufferedReader br = null;
        try {
            String u = "https://pastebin.com/raw/LhxJ7GRG";
            URL url = new URL(u);

            br = new BufferedReader(new InputStreamReader(url.openStream()));
            String line = "";

            int counter = 0;
            String next;
            while ((line = br.readLine()) != null) {

                if(counter >= 2) {

                    next = br.readLine();


                    System.out.println("Current Line: " + line);
                    System.out.println("Next Line: " + next);
                    String tester = next.substring(next.indexOf(": \"") + 3, next.length() - 1);
                    if (geSearch.getText().equalsIgnoreCase(tester)){
                        item.setName(geSearch.getText());
                        item.setId(line.substring(line.indexOf(": ") + 2, line.length() - 1));

                        break;
                    }

                }

                item.setId("");
                Price.setText("");
                counter++;

                    }

            }

        catch (MalformedURLException e) {
            System.out.println("Error");

        }


    }
    public void changeScene() throws Exception{
        Stage primaryStage = (Stage) Hiscores.getScene().getWindow();
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setScene(new Scene(root, 500, 600));
        primaryStage.show();

    }




}

Как отметил Андреас, возможно, моя проблема была с тестером, но это не сработало, когда я попробовал это решение.

if( counter < 12045)
   tester = next.substring(next.indexOf(": \"") + 3, next.length() - 1); 
else 
       tester = "";

1 Ответ

0 голосов
/ 30 сентября 2018

java.lang.StringIndexOutOfBoundsException: индекс строки вне диапазона: -2

Вы пытаетесь сослаться на индекс, который не содержится в строке.Я думаю, что проблема может быть в next.indexOf(": \"") + 3

...