我正在尝试从我开发的 BlackBerry 应用程序访问网络服务。
但是,在运行该应用程序时,我得到了
" App Error 104 Uncaught: NullPointerException "
我无法调试,出于某种奇怪的原因,我的调试器在我开始调试后立即自动关闭。
对可能是什么原因有什么建议吗?我想提一下,我已经从 BlackBerry 收到了三个 .csi 签名文件,但是每当我尝试对应用程序进行签名时,它都会失败:The Signature information in the code signing register request is not of appropriate length .这个错误可能是由于签署应用程序造成的吗?
这是我到目前为止所做的:
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");
}
}
}
最佳答案
代码签名
正如 Th0rndike 所说,您无需签署代码即可在模拟器中运行,因此这不是您的问题(在模拟器中)。
让调试器再次工作
另外,如果您在设置断点或单步执行您自己的 Java 源代码时遇到问题,那么:
- 在模拟器中,像在普通设备上一样删除应用程序。
- 重启模拟器。
- 再次尝试从 Eclipse 运行。如果还是不行:
- 在 Eclipse 中,从 BlackBerry 菜单中选择 Clean Simulator,然后选择您正在使用其模拟器的 JRE 包(例如 5.0.0、6.0.0 等) .)
- 再次尝试从 Eclipse 运行。如果还是不行:
- 我会尝试重新安装 Eclipse 和 BlackBerry Java 插件(一起 ... 而不是安装非 BlackBerry Eclipse IDE,然后单独添加 BlackBerry 插件)。您可以下载完整的 Eclipse + BlackBerry 插件 from this site .
请记住,您将不能单步执行 作为 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)
不是您的代码。但是,假设 MyWidget.java
是您的 Java 源文件之一。
查找抛出异常的位置
如果您正在运行,并且无法找到未捕获的 NullPointerException
(或其他异常)被抛出的位置,see this answer .基本上,只需将此调试代码放在您的主程序中(例如 MyApp.java):
public static void main(String[] args)
{
try {
Application theApp = new MyApp();
theApp.enterEventDispatcher();
} catch (Throwable t) {
t.printStackTrace();
}
}
然后,在捕获到 Throwable
之后,检查 Eclipse Console 窗口中的堆栈跟踪信息,显示异常的来源。然后,再次调试,尝试进入该代码,看看有什么问题。
但是,获得一个正常运行的调试器是高效开发的绝对要求。在调试对您有用之前,不要为其他问题烦恼。
关于java - 在黑莓模拟器上运行网络服务时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11308647/