2012-08-14 23 views
0

我一直在Blue Pelican Java中尝试这个项目超过一个小时,我不确定它为什么不起作用。基本上我需要做的是将常规数字转换为二进制数字,假设1表示开关打开,0表示关闭,则检查二进制数字中的每个数字,并打印它是打开还是关闭。他们表示,他们要我怎么做:Blue Pelican Java项目“掩蔽遥测数据”;编译但不运行?

“假设我们不妨先看看从左边第三位使用下面所示的掩模作为 来位与,以 原号只能看在第三位。1个0 1 1 0 0 0 1bin = 177dec 0 0 1 0 0 0 0 0bin = 32dec(这是掩模)

0 0 1 0 0 0 0 0bin = 32dec =(177 & 32)

注意这种按位AND与屏蔽值32(25,因为 第三位位置左边的位置值为25) 会在第三个位的位置产生一个精确等于原始数的第三个位的位置。所有其他位的位置是 保证为0。因此,逐位AND-ING的这个结果可能是 测试,以查看是否整个值为0。如果它是大于0,这 意味着在测试位置的位是一个1”。

在这一点我只是在Switches.in文件夹中测试第一个数字22,而不是导入整个文件夹,代码编译后,它开始打印我想要的内容,但突然切割并进入看起来像这样的错误消息:

Switch sw57is "off 
Exception in thread "main" java.util.NoSuchElementException 
    at java.util.StringTokenizer.nextToken(StringTokenizer.java:332) 
    at Tester.main(Tester.java:32) 

这里是我的代码:

import java.io.*; 
import java.util.*; 
import java.text.*; 

public class Tester 
{ 
    public static void main(String args[]) 
    { 
    int j=22; 
    String jj=Integer.toBinaryString(j); 
    StringTokenizer sc=new StringTokenizer(jj,""); 
    int l=(sc.countTokens()); 


    int a[]=new int[l]; 
    int xx=0; 
    for(int x=l; x>-1; x--) 
    { 
     xx=xx++; 
     double p=(Math.pow(2,xx)); 
     int pp=(int)p; 
     int n=((j)&(pp)); 
     String nn=Integer.toBinaryString(n); 
     StringTokenizer nnn=new StringTokenizer(nn); 
     int po=(nnn.countTokens()); 
     int sum=0; 

     System.out.println(nnn); 

     for(int xxx=-1; xxx<po; xxx++) 
     { 
      sum=sum+(Integer.parseInt(nnn.nextToken())); 


     if(sum>0) 
     { 
      System.out.println("Switch sw"+(x+56)+"is \"on"); 
     } 
     else if(sum==0) 
     { 
      System.out.println("Switch sw"+(x+56)+"is \"off"); 
     } 
     } 
    } 
} 
} 

我不确定代码有什么问题。任何建议将不胜感激。谢谢,并为冗长的帖子感到抱歉!

+0

那么测试用例的预期完整输出是什么? – david 2012-08-14 00:48:04

回答

0

的问题是,从-1开始您将超过令牌可用数量:

for (int xxx = -1; xxx < po; xxx++) { 

其中

po = nnn.countTokens() 

...所以,纠正,用途:

for (int xxx = 0; xxx < po; xxx++) { 

此外,由于xxx不在其他地方使用,您可以简单地使用:

while (nnn.hasMoreTokens()) { 
    sum = ... 
} 
0

问题与sum=sum+(Integer.parseInt(nnn.nextToken()));。请参阅

  1. java StringTokenizer - can nextToken return null?
  2. http://docs.oracle.com/javase/1.4.2/docs/api/java/util/StringTokenizer.html#nextToken

我想下面的代码修复该问题(我已经添加了调试信息数的println):

import java.io.*; 
import java.util.*; 
import java.text.*; 

class Tester 
{ 
    public static void main(String args[]) 
    { 
    int j=22; 
    String jj=Integer.toBinaryString(j); 
    StringTokenizer sc=new StringTokenizer(jj,""); 
    int l=(sc.countTokens()); 


    int a[]=new int[l]; 
    int xx=0; 
    for(int x=l; x>-1; x--) 
    { 
     xx=xx++; 
     double p=(Math.pow(2,xx)); 
     int pp=(int)p; 
     int n=((j)&(pp)); 
     String nn=Integer.toBinaryString(n); 
     StringTokenizer nnn=new StringTokenizer(nn); 
     String nToken; 
     int po=(nnn.countTokens()); 
     int sum=0; 
     System.out.println("x = "+ x); 
     System.out.println("po = "+ po); 

     System.out.println(nnn); 

     for(int xxx=0; xxx<po; xxx++) 
     { 
      System.out.println("xxx = "+ xxx); 
      sum=sum+(Integer.parseInt(nnn.nextToken())); 


     if(sum>0) 
     { 
      System.out.println("Switch sw"+(x+56)+"is \"on"); 
     } 
     else if(sum==0) 
     { 
      System.out.println("Switch sw"+(x+56)+"is \"off"); 
     } 
     } 
    } 
} 
} 
0

我没有看到声明您从中获取数据的文件。如果你希望你的程序能够工作,你可以考虑把你的数据从中获取。