首页 文章

使用简单的二进制代码转换器的例外

提问于
浏览
0

我的Java(applet)中的简单二进制代码转换器出了问题:

import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class dual_convert extends Applet implements ActionListener{
  TextField dual;
  TextField decimal;
  Button dual_b;
  Button decimal_b;
  Label dual_l;
  Label decimal_l;
  int decimal_i;
  String dual_s [];
  int dual_i;
  int decimal_e;

  public void init() {
    setLayout(null);

    dual = new TextField();
    dual.setBounds(90,10,100,25);
    add(dual);

    decimal = new TextField();
    decimal.setBounds(90,40,100,25);
    add(decimal);

    decimal_l = new Label("Decimal:");
    decimal_l.setBounds(10,40,80,25);
    add(decimal_l);

    dual_l = new Label("Binary:");
    dual_l.setBounds(10,10,80,25);
    add(dual_l);

    dual_b = new Button ("Convert");
    dual_b.setBounds(200,10,80,25);
    add(dual_b);
    dual_b.addActionListener(this);

    decimal_b = new Button ("Convert");
    decimal_b.setBounds(200,40,80,25);
    add(decimal_b);
    decimal_b.addActionListener(this);

  }

  public void actionPerformed (ActionEvent e) {
    if (e.getSource()==decimal_b) {
      decimal_i = Integer.parseInt(decimal.getText());  
      int ih = 0;
      dual.setText("");
      while (decimal_i>0) {
        dual.setText((decimal_i % 2)+dual.getText());
        decimal_i = decimal_i / 2; 
        ih++;
      }    
    }

    if (e.getSource()==dual_b) {
      dual_s = dual.getText().split("");
      dual_i = dual_s.length;
      decimal.setText("");
      for (int i=0;dual_i>0;dual_i--) {
        decimal_e = decimal_e + (Integer.parseInt(dual_s[dual_i]) * 2^i); 
        i++;
      } 
      decimal.setText(decimal_e+"");       
    } 
  }
}

它通过按Convert Binary to Decimal抛出此异常:

线程“AWT-EventQueue-1”中的异常java.lang.ArrayIndexOutOfBoundsException:8位于java.awt.Button的java.awt.Button.processActionEvent(Button.java:409)的dual.actionPerformed(dual.java:65) .processEvent(Button.java:377)位于java.awt.Component.dispatchEvent(Component.java:4861)的java.awt.Component.dispatchEvent(Component.java:4687)java.awt.EventQueue.dispatchEventImpl(EventQueue . java:729)at java.awt.EventQueue.access $ 200(EventQueue.java:103)at java.awt.EventQueue $ 3.run(EventQueue.java:688)at java.awt.EventQueue $ 3.run(EventQueue.java: 686)在java.security.ProtectionDomain的java.security.AccessController.doPrivileged(Native Method)中,java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:76)at java.awt .EventQueue $ 4.run(EventQueue.java:702)java.awt.EventQueue $ 4.run(EventQueue.java:700)at java.security.AccessController.doPrivileged(Native Method)at java.security.ProtectionDomain $ 1.doInte java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java)上的java.awt.EventQueue.dispatchEvent(EventQueue.java:699)中的rsectionPrivilege(ProtectionDomain.java:76) :161)java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)at java .awt.EventDispatchThread.run(EventDispatchThread.java:91)

对于二进制 - >十进制转换我使用这个系统(还有其他吗?):

100101 = [(1)×25] [(0)×24] [(0)×23] [(1)×22] [(0)×21] [(1)×20]

100101 = [1×32] [0×16] [0×8] [1×4] [0×2] [1×1]

100101 = 3710

https://en.wikipedia.org/wiki/Binary_number

编辑:Talas发布后有一个新的例外:

线程“AWT-EventQueue-1”中的异常java.lang.NumberFormatException:对于java.lang.Integer.parseInt(Integer.java)中java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)的输入字符串:“” :504)在java.awt.Button的java.awt.Button.processActionEvent(Button.java:409)的dual_convert.actionPerformed(dual_convert.java:64)上的java.lang.Integer.parseInt(Integer.java:527) .processEvent(Button.java:377)位于java.awt.Component.dispatchEvent(Component.java:4861)的java.awt.Component.dispatchEvent(Component.java:4687)java.awt.EventQueue.dispatchEventImpl(EventQueue . java:729)at java.awt.EventQueue.access $ 200(EventQueue.java:103)at java.awt.EventQueue $ 3.run(EventQueue.java:688)at java.awt.EventQueue $ 3.run(EventQueue.java: 686)在java.security.ProtectionDomain的java.security.AccessController.doPrivileged(Native Method),java.security.ProtectionDomain $ 1.doIntersectionPrivilege(ProtectionDomain.java:87)的$ 1.doIntersectionPrivilege(ProtectionDomain.java:76)在java.security.ProtectionDomain的java.security.AccessController.doPrivileged(Native Method)java.awt.EventQueue $ 4.run(EventQueue.java:700)上的java.awt.EventQueue $ 4.run(EventQueue.java:702)位于java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)的java.awt.EventQueue.dispatchEvent(EventQueue.java:699)中的$ 1.doIntersectionPrivilege(ProtectionDomain.java:76),位于java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread) .java:161)java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

2 回答

  • 0

    问题出在这里:

    for (int i=0;dual_i>0;dual_i--) {
        decimal_e = decimal_e + (Integer.parseInt(dual_s[dual_i - 1]) * 2^i); 
        i++;
      }
    

    dual_i = dual_s.length; 以来,您应该使用 dual_s[dual_i - 1] 而不是 dual_s[dual_i] ,并且数组索引以 0 开头

  • 0

    你有这个类和一个名为dual的文本域 . 我对这个编译感到有些惊讶,但这可能是问题所在 .

相关问题