3

我正在尝试从我开发的 BlackBerry 应用程序访问 Web 服务。

但是,在运行应用程序时,我得到

“应用程序错误 104 未捕获:NullPointerException”

我无法调试,出于某种奇怪的原因,我的调试器会在我开始调试后立即自动关闭。

关于可能是什么原因的任何建议?我想提一下,我已经收到了来自 BlackBerry 的三个 .csi 签名文件,但是每当我尝试对应用程序进行签名时,它都会失败:代码签名注册请求中的签名信息长度不合适。此错误可能是由于签署应用程序造成的吗?

这是我到目前为止所做的:

package mypackage;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.rmi.RemoteException;
import java.util.Hashtable;

import javacard.framework.UserException;

import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.location.Location;
import javax.microedition.location.LocationProvider;

import org.kobjects.base64.Base64;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransport;
import org.xmlpull.v1.XmlPullParserException;

import net.rim.device.api.system.*;
import net.rim.device.api.ui.*;
import net.rim.device.api.ui.component.*;
import net.rim.device.api.ui.component.pane.TitleView;
import net.rim.device.api.ui.container.*;
import net.rim.device.api.ui.image.Image;
import net.rim.device.api.xml.jaxp.SAXParserImpl;

public class LoginTest extends UiApplication 
{

    public static void main(String[] args)  
    {
         //Create a new instance of the app
         //and start the app on the event thread.

        LoginTest app = new LoginTest();
        app.enterEventDispatcher();
    }

    public LoginTest()
    {
         //Display a new screen.
         pushScreen(new LoginTestScreen());
    }

}

//Create a new screen that extends MainScreen and provides
//behaviour similar to that of other apps.

final class LoginTestScreen extends MainScreen
{
   //declare variables for later use
   private InfoScreen _infoScreen;
   private ObjectChoiceField choiceField;
   private int select;
   BasicEditField username;
   PasswordEditField passwd;
   CheckboxField checkBox1;
   ButtonField loginBtn;

   public LoginTestScreen()
   {
        //Invoke the MainScreen constructor.

        super();

        //Add a screen title.

        setTitle("Track24ELMS");

        LabelField login = new LabelField("ELMS Login", LabelField.FIELD_HCENTER); 
        login.setFont(Font.getDefault().derive(Font.BOLD, 30));
        login.setMargin(10, 0, 20, 0); //To leave some space from top and bottom

        HorizontalFieldManager user = new HorizontalFieldManager();
        user.setMargin(0, 0, 10, 0);
        HorizontalFieldManager pass = new HorizontalFieldManager();
        pass.setMargin(0, 0, 20, 0);
        HorizontalFieldManager checkbox = new HorizontalFieldManager();
        checkbox.setMargin(0, 0, 30, 0);
        HorizontalFieldManager btns = new HorizontalFieldManager(HorizontalFieldManager.FIELD_HCENTER);

        LabelField usernameTxt = new LabelField("Username :");
        LabelField passwordTxt = new LabelField("Password :");

        username = new BasicEditField();
        passwd = new PasswordEditField();

        loginBtn = new ButtonField("Login", ButtonField.CONSUME_CLICK); 
        loginBtn.setChangeListener(new LoginButtonListener());

        checkBox1 = new CheckboxField("Remember me",false);

        user.add(usernameTxt);
        user.add(username);
        pass.add(passwordTxt);
        pass.add(passwd);
        //checkbox.add(checkBox1);
        btns.add(loginBtn);
        add(login);
        add(user);
        add(pass);
        add(checkBox1);
        add(btns);
   }

   private class LoginButtonListener implements FieldChangeListener {
       public void fieldChanged(Field field, int context) {
       //Open a new screen
       String uname = username.getText();
       String pwd = passwd.getText();

       //If there is no input
       if (uname.length() == 0 || pwd.length()==0)
       Dialog.alert("One of the textfield is empty!");
       else 
       {
           final String URL = "http://xxx.xxx.com/xxx/xxx.asmx";
           final String METHOD_NAME = "ValidateCredentials";
           final String NAMESPACE = "http://tempuri.org/";
           final String SOAP_ACTION = NAMESPACE+METHOD_NAME;
           //final String URL = "http://prerel.track24elms.com/Android/T24AndroidLogin.asmx/ValidateCredentials";

           SoapObject resultRequestSOAP = null;
           HttpConnection httpConn = null;
           HttpTransport httpt;
           System.out.println("The username" + uname + "password" + pwd );
           SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
           request.addProperty("Username", "abc");//First parameter is tag name provided by web service
           request.addProperty("Password", "xyz");
           System.out.println("The request is=======" + request.toString());
           SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
           envelope.bodyOut = request;
           envelope.dotNet = true;
           envelope.encodingStyle = SoapSerializationEnvelope.XSD;
           envelope.setOutputSoapObject(request);
           System.out.println("The envelope has the value++++"+ envelope.toString());

           /* URL+  Here you can add paramter so that you can run on device,simulator etc. this will work only for wifi */
           httpt = new HttpTransport(URL+ ";deviceside=true;ConnectionUID=S TCP-WiFi");
           httpt.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
           httpt.debug = true;
           try
           {
               System.out.println("SOAP_ACTION    ==   " + SOAP_ACTION);
               httpt.call(SOAP_ACTION, envelope);
               System.out.println("the tranport" + httpt.toString());
               resultRequestSOAP = (SoapObject) envelope.bodyIn;
               System.out.println("result    ==   " + resultRequestSOAP);            
           }
           catch (IOException e) {
               // TODO Auto-generated catch block
               System.out.println("The exception is IO==" + e.getMessage());
           } catch (XmlPullParserException e) {

               // TODO Auto-generated catch block
               System.out.println("The exception xml parser example==="
                       + e.getMessage());
           }
           System.out.println( resultRequestSOAP);
           if(resultRequestSOAP.equals("credentialaccepted"))
           {
           UiApplication.getUiApplication().pushScreen(new InfoScreen()); //Open a new Screen
           }
           else
           {
               System.out.println("Login details not valid");
           }
         }
      }

   };

   //To display a dialog box when a BlackBerry device user
   //closes the app, override the onClose() method.

   public boolean onClose()
   {
        Dialog.alert("Goodbye!");
        System.exit(0);
        return true;
   }

   //Create a menu item for BlackBerry device users to click to see more 
   //information about the city they select.

   private MenuItem _viewItem = new MenuItem("More Info", 110, 10) 
   {
        public void run() 
        {
             //Store the index of the city the BlackBerry device user selects

             select = choiceField.getSelectedIndex();

             //Display a new screen with information about the
             //city the BlackBerry device user selects

             _infoScreen = new InfoScreen();
             UiApplication.getUiApplication().pushScreen(_infoScreen);
        }
   };

   //Create a menu item for BlackBerry device users to click to close 
   //the app.

   private MenuItem _closeItem = new MenuItem("Close", 200000, 10) 
   {
        public void run()
        {
             onClose();
        }
   };


   //Create an inner class for a new screen that displays
   //information about the city a BlackBerry device user selects.

   private class InfoScreen extends MainScreen
   {
        public InfoScreen() 
        {
             super();

             setTitle("Itinerary");


             LabelField login = new LabelField("Employee Itinerary", LabelField.FIELD_HCENTER); 

             Bitmap bitmap = Bitmap.getBitmapResource("img1.jpg");
             EditField statusMsg = new EditField("Status Message", "Update status here");

        }
   }
}
4

1 回答 1

2

代码签名

正如 Th0rndike 所说,您无需签署代码即可在模拟器中运行,所以这不是您的问题(在模拟器中)。

让调试器再次工作

此外,如果您甚至无法设置断点或单步执行您自己的 Java 源代码,那么:

  1. 在模拟器中,像在普通设备上一样删除应用程序。
  2. 重启模拟器。
  3. 再次尝试从 Eclipse 运行。如果它仍然不起作用:
  4. 在 Eclipse 中,从BlackBerry菜单中选择Clean Simulator,然后选择您正在使用其模拟器的 JRE 包(例如 5.0.0、6.0.0 等)
  5. 再次尝试从 Eclipse 运行。如果它仍然不起作用:
  6. 我会尝试重新安装 Eclipse 和 BlackBerry Java 插件(一起安装......而不是安装非 BlackBerry Eclipse IDE,然后单独添加 BlackBerry 插件)。您可以从这个站点下载完整的 Eclipse+BlackBerry 插件。

请记住,您将无法进入作为Java 运行时和 RIM 库一部分的 Java 代码。您没有这些的 Java源代码,只有二进制库。所以,如果你有这行代码:

String s1 = "afdafsdasdf";
String substring = s1.substring(0, 10);  // <- can not step IN, can step OVER
MyWidget mw = new MyWidget();
mw.foo();                                // <- can step IN, or OVER

您将无法进入第二行,因为substring(int,int)不是您的代码。但是,您应该能够在mw.foo()没有看到“未找到源”错误的情况下进入,假设MyWidget.java是您的 Java 源文件之一。

查找抛出异常的位置

如果您正在运行,并且无法找出抛出未捕获NullPointerException (或其他异常)的位置,请参阅此答案。基本上,只需将此调试代码放在您的主程序中(例如 MyApp.java):

public static void main(String[] args)
{
    try {
        Application theApp = new MyApp();
        theApp.enterEventDispatcher();
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

然后,在Throwable被捕获后,检查 Eclipse控制台窗口中的堆栈跟踪信息,显示异常来自何处。然后,再次调试,尝试进入该代码,看看有什么问题。

但是,获得功能正常的调试器是生产性开发的绝对要求。在调试对您有用之前,不要为其他问题烦恼。

于 2013-04-19T21:43:08.210 回答