Java 使用Double.parseDouble from文本字段时出错

Java 使用Double.parseDouble from文本字段时出错,java,parsing,actionlistener,Java,Parsing,Actionlistener,我一直在尝试从文本字段中获取输入,并将其放入双变量中。但每当我尝试使用Double.parseDouble(textf.getText())时,我都会遇到错误,我使用scanner进行了测试,结果很好 private class NumRTFHandler implements ActionListener { public void actionPerformed(ActionEvent e) { String romanN = ""; String d

我一直在尝试从文本字段中获取输入,并将其放入双变量中。但每当我尝试使用
Double.parseDouble(textf.getText())
时,我都会遇到错误,我使用scanner进行了测试,结果很好

private class NumRTFHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        String romanN = "";
        String dec = numDTF.getText();
        Double decimal = Double.parseDouble(dec);
    }
}
我猜可能是动作听众,但我不知道如何处理
Double.parseDouble()
既不能使用文本字段也不能使用字符串

请帮忙

这些都是错误

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: empty String
at sun.misc.FloatingDecimal.readJavaFormatString(Unknown Source)
at java.lang.Double.parseDouble(Unknown Source)
at RomanNumeralConvertert$NumRTFHandler.actionPerformed(RomanNumeralConvertert.java:40)
at javax.swing.JTextField.fireActionPerformed(Unknown Source)
at javax.swing.JTextField.postActionEvent(Unknown Source)
at javax.swing.JTextField$NotifyAction.actionPerformed(Unknown Source)
at javax.swing.SwingUtilities.notifyAction(Unknown Source)
at javax.swing.JComponent.processKeyBinding(Unknown Source)
at javax.swing.JComponent.processKeyBindings(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.KeyboardFocusManager.redispatchEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(Unknown Source)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
我宣布numDTF在顶部

JTextField numDTF;
它从用户那里获取输入

编辑:

这是全部代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RomanNumeralConvertert extends JFrame {

  private static final int HEIGHT = 60;  
  private static final int WIDTH = 600;

  private JLabel numRL, numDL;  
  private JTextField numRTF, numDTF;
  private NumRTFHandler nrh;
  private NumDTFHandler ndh;

  public RomanNumeralConvertert() {
    setTitle("Roman Numeral to Decimal Converter");                  
    numRL = new JLabel("Decimal Value: ", SwingConstants.RIGHT);
    numDL = new JLabel("Roman Numeral: ", SwingConstants.RIGHT);
    numRTF = new JTextField(10);
    numDTF = new JTextField(10);
    nrh = new NumRTFHandler();
    ndh = new NumDTFHandler();
    numRTF.addActionListener(nrh);
    numDTF.addActionListener(ndh);

    Container pane = getContentPane();            
    pane.setLayout(new GridLayout(1, 4));
    pane.add(numDL); pane.add(numDTF);
    pane.add(numRL); pane.add(numRTF);

    setSize(WIDTH, HEIGHT);                     
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
  }

  private class NumRTFHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      String romanN = "";
      String dec = numDTF.getText();
      Double decimal = Double.parseDouble(dec);
      //converting to Roman Numerals 
      while(decimal >= 1000){
        romanN += "M";
        decimal -= 1000.0;  
      }
      while(decimal >= 900){
        romanN += "CM";
        decimal -= 900;  
      }
      while(decimal >= 500){
        romanN += "D";
        decimal -= 500;  
      }
      while(decimal >= 400){
        romanN += "CD";
        decimal -= 400;  
      }
      while(decimal >= 100){
        romanN += "C";
        decimal -= 100;  
      }
      while(decimal >= 90){
        romanN += "XC";
        decimal -= 90;  
      }
      while(decimal >= 50){
        romanN += "L";
        decimal -= 50;  
      }
      while(decimal >= 40){
        romanN += "XL";
        decimal -= 40;  
      }
      while(decimal >= 10){
        romanN += "X";
        decimal -= 10;  
      }
      while(decimal >= 9){
        romanN += "IX";
        decimal -= 9;  
      }
      while(decimal >= 5){
        romanN += "V";
        decimal -= 5;  
      }
      while(decimal >= 4){
        romanN += "IV";
        decimal -= 4;  
      }
      while(decimal >= 1){
        romanN += "I";
        decimal -= 1;  
      }
      numRTF.setText(romanN);
    }
  }

  private class NumDTFHandler implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      String romanN = numDTF.getText();
      double decimal = 0;
      romanN.toUpperCase();
      int i=0;
      while(i <= romanN.length()){
        char char1 = romanN.charAt(i);
        i++;
        char char2 ='i';
        if(i < romanN.length()){
          char2 = romanN.charAt(i+1);
          i++;
        }
        if( char1 == ('M')){
          decimal +=1000;
        }
        if( char1 == ('D')){
          decimal +=500;
        }
        if( char1 ==('C')){
          if( char2 == ('M')){
            decimal +=900;
          }
          if( char1 == ('D')){
            decimal +=400;
          }
        }else{
          decimal += 100;
        }
        if( char1 == ('L')){
          decimal +=50;
        }
        if( char1 == ('X')){
          if( char2 == ('C')){
            decimal +=90;
          }
          if( char1 == ('L')){
            decimal +=40;
          }
        }else{
          decimal += 10;
        }
        if( char1 == ('V')){
          decimal +=5;
        }
        if( char1 == ('1')){
          if( char2 == ('X')){
            decimal +=9;
          }
          if( char1 == ('V')){
            decimal +=4;
          }
       }else{
          decimal += 1;
       }
      }
      numDTF.setText("" + decimal);

    }
  }

  public static void main(String[] args) {
    RomanNumeralConvertert gui = new RomanNumeralConvertert();
  }
  // End of the Code
}
import javax.swing.*;
导入java.awt.*;
导入java.awt.event.*;
公共类Converter扩展了JFrame{
专用静态最终内部高度=60;
专用静态最终整数宽度=600;
私人JLabel numRL,numDL;
私有JTextField numRTF、numDTF;
私人NUMRTFH;
私有numdtfndh;
公共语言转换程序(){
setTitle(“罗马数字到十进制转换器”);
numRL=新的JLabel(“十进制值:”,SwingConstants.RIGHT);
numDL=新的JLabel(“罗马数字:”,SwingConstants.RIGHT);
numRTF=新的JTextField(10);
numDTF=新的JTextField(10);
nrh=新的NumRTFHandler();
ndh=新的NumDTFHandler();
numRTF.addActionListener(nrh);
numDTF.addActionListener(ndh);
容器窗格=getContentPane();
窗格.setLayout(新的GridLayout(1,4));
pane.add(numDL);pane.add(numDTF);
pane.add(numRL);pane.add(numRTF);
设置尺寸(宽度、高度);
setVisible(真);
setDefaultCloseOperation(关闭时退出);
}
私有类NumRTFHandler实现ActionListener{
已执行的公共无效操作(操作事件e){
字符串romanN=“”;
String dec=numDTF.getText();
双十进制=Double.parseDouble(dec);
//转换成罗马数字
而(十进制>=1000){
罗曼+=“M”;
十进制-=1000.0;
}
而(十进制>=900){
罗曼+=“厘米”;
十进制-=900;
}
而(十进制>=500){
罗曼+=“D”;
小数-=500;
}
而(十进制>=400){
罗曼+=“CD”;
十进制-=400;
}
而(十进制>=100){
罗曼+=“C”;
十进制-=100;
}
而(十进制>=90){
罗曼+=“XC”;
十进制-=90;
}
而(十进制>=50){
罗曼+=“L”;
十进制-=50;
}
而(十进制>=40){
罗曼+=“XL”;
十进制-=40;
}
而(十进制>=10){
罗曼+=“X”;
十进制-=10;
}
而(十进制>=9){
罗曼+=“九”;
十进制-=9;
}
而(十进制>=5){
罗曼+=“V”;
小数-=5;
}
而(十进制>=4){
罗曼+=“四”;
小数-=4;
}
而(十进制>=1){
罗曼+=“我”;
十进制-=1;
}
numRTF.setText(罗马);
}
}
私有类NumDTFHandler实现ActionListener{
已执行的公共无效操作(操作事件e){
字符串romanN=numDTF.getText();
双十进制=0;
romanN.toUpperCase();
int i=0;

(i您得到一个
空字符串
错误,根据您发布的代码,我猜调用
getText()
方法无法返回任何内容,因为
numDTF
没有值。

您得到了什么错误?Post stacktrace。“我得到了错误”:您能指定哪个错误吗?堆栈跟踪非常有用。textf.getText()获取正确的双精度+你面临的错误当问问题时,告诉我们你得到的确切错误,如果我们知道要查找什么,我们可以帮助你进行更好的更改。顺便说一句,你在哪里声明了
numDTF
?错误表明字符串为空。
numDTF
字段有任何内容吗?你应该检查
dec
在尝试解析之前,通过
isEmpty()
字符串。文本字段
numDTF
应该从用户那里获得输入,我对其进行了测试,每次我键入一个数字并按enter键时,都会给出此错误应该获得或确实获得。-添加其余代码