Exception-----异常可谓是我们程序员,在开发程序的时候,常见的伙伴,有时候,它让你苦不堪言,调试半天也弄不出错在哪里了。今天就这个问题,根据自己的开发经验,总结自己经常遇到的各种异常,仅供参考,不足之处,望见谅。
一.NullPointException空指针异常
1.概述:该异常经常出现,主要原因是没有正确的理解对象这个概念,我们知道,在java中只有对象才可以用来调用方法,那我们如果只是声明一个变量,就不能用来调用方法。此时调用方法就会出现空指针异常。
2.处理办法:我们只需要找到跑出异常的那一句话,然后找到相应的变量,最后,让该变量指向一个对象就可以了。
3.例句:
public class ExceptionTest { public static void main(String[] args) { //NullPointException,空指针异常 String str = null; str.length(); } }
4.抛出异常,
Exception in thread "main" java.lang.NullPointerException
at study.exception.ExceptionTest.main(ExceptionTest.java:5)。
也就是str.length(),这一句话。我们发现,str是一个空的对象。在这里只需要给str一个值就可以了。(String 类比较特殊)
二.NumberFormatException 字符串转换异常
1.概述:应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
2.处理办法:根据不同的题意,看看这个方法适合什么范围的树枝转换
3.例句:
public class ExceptionTest { public static void main(String[] args) { //NumberFormatException,字符串转换成一种数值类型出现异常 String str = "123abc"; int s = Integer.parseInt(str); } }
4.抛出异常:
Exception in thread "main" java.lang.NumberFormatException: For input string: "123abc"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at study.exception.ExceptionTest.main(ExceptionTest.java:5)
我们知道,parseInt(),转换的范围是str中的字符必须是0-9之间的,修改一下范围即可,我们明白,出现这个异常后,我们要立即查看这个函数适合的范围对不对。
三.ClassCastException 强制转型出现的异常
1.概述:当试图将对象强制转换为不是实例的子类时,抛出该异常。
2.处理办法:查看该类型和转换以后的类型是不是“父子关系”,如果不是,则转型失败。
3.例句:
public class ExceptionTest { public static void main(String[] args) { //ClassCastException,父类向下转型的时候,会出现这个异常 Object obj = new JTextArea(); JButton jb = (JButton)obj; } }
4.异常:
Exception in thread "main" java.lang.ClassCastException: javax.swing.JTextArea cannot be cast to javax.swing.JButton
at study.exception.ExceptionTest.main(ExceptionTest.java:4).向下转型的基础是,两个类型必须是父子类的关系,
才有可能转型,即使如此,有时候,强制转型有时候也会出现错误。
四.IndexOutOfBoundsException 数组越界异常
1.概述:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
2.处理办法:这里我们看看抛出的异常的后面,会标明是数组是哪个位置越界了,我们找到这个位置,将数目改变一下即可。
3.例句:
public class ExceptionTest { public static void main(String[] args) { //IndexOutOfBoundsException,数组越界,会出现这个异常 int[] a = new int[10]; a[10] = 10; } }
4。异常:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at study.exception.ExceptionTest.main(ExceptionTest.java:5)
异常中有个10,表明,我们这个数组的第10个位置的时候越界了。我们就知道该如何处理了。
五.NoSuchFieldException 没有这个字段异常
1.概述:类不包含指定名称的字段时产生的信号。
2.处理办法:这个经常用于文件的操作过程当中,我们要打开一个文件,但是该文件不存在,就会抛出这个异常
3.例句:
public class ExceptionTest { public static void main(String[] args) { //NoSuchFieldException,数组越界,会出现这个异常 try { FileOutputStream file = new FileOutputStream("111"); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
4.异常,这里如果是在eclipse开发的话,会给你主动提示,这里是要捕获没有这个文件的异常
六.NoSuchMethodException没有这个方法的异常
1.概述:无法找到某一特定方法时,抛出该异常。这里就不做过多的描述了,很简单,找到看看这个方法是不是存在。
总结:异常是我们在编程不时候,很容易遇到的事情,我们需要灵活的学会捕捉这个异常,处理方法:
1.一般我们用这个方法来进行处理:
try{ 可能出现异常的代码 }catch(Exception e) { 捕获后处理的办法,经常用e.printStackTrace();这个方法来打印异常的详细信息 }finally { 不管是不是捕获到了异常,这里都会执行 }
2.还有另一种方法,直接throws将相应的异常抛出,不过这个在大型的编程项目里,会比较麻烦。
只要是调用了这个方法的方法,我们要不断的抛出异常。
大家一起加油,争取早日交到异常这个好朋友!
主要就是重写 onAttachedToWindow () 和 onKeyDown (...,...) 这两个方法。
前者是起到拦截作用的,后者是监听到HOME按键事件后的动作,如果没动作可以不要 onKeyDown。
还要注意,要加权限:
<uses-permission android:name="android.permission.DISABLE_KEYGUARD "></uses-permission>
// 转载请注明出处: http://aking86.iteye.com/admin/blogs/1317186
虽然网上有很多,但介绍的都不是很详细,也不算深入,我在这里研究了下,并把日志给捞了出来。
里面包括 HOME拦截, BACK拦截,打捞日志。
@Override public void onAttachedToWindow () { System.out.println("Page01 -->onAttachedToWindow"); this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); }
@Override public boolean onKeyDown (int keyCode, KeyEvent event) { System.out.println("Page01 -->onKeyDown: keyCode: " + keyCode); if (KeyEvent.KEYCODE_HOME == keyCode) { System.out.println("HOME has been pressed yet ..."); // android.os.Process.killProcess(android.os.Process.myPid()); Toast.makeText(getApplicationContext(), "按了HOME 键...", Toast.LENGTH_LONG).show(); } else if (KeyEvent.KEYCODE_BACK == keyCode) { System.out.println("BACK has been pressed yet ..."); //按了返回 } return super.onKeyDown(keyCode, event); // 不会回到 home 页面 }
通过打印日志,还得出一个结论:
onAttachedToWindow() 方法只会执行一次,也就是在第一次 onResume() 之后,以后就不再执行了。
下面是我打印的日志。包含了Activity的生命周期,查看起来很方便。操作流程也就是打开一个页面,先按下HOME,弹出提示,再按下一个Button,里面是 finish()方法。
[root ]# adb logcat -d -v time -s System.out:I 12-19 13:19:43.290 I/System.out( 824): Page01 -->onStart 12-19 13:19:43.290 I/System.out( 824): Page01 -->onResume 12-19 13:19:43.369 I/System.out( 824): Page01 -->onAttachedToWindow 12-19 13:19:50.959 I/System.out( 824): Page01 -->onKeyDown: keyCode: 3 12-19 13:19:50.959 I/System.out( 824): HOME has been pressed yet ... 12-19 13:22:17.999 I/System.out( 824): Page01 click to exit(finish) 12-19 13:22:18.079 I/System.out( 824): Page01 -->onPause 12-19 13:22:18.590 I/System.out( 824): Page01 -->onStop 12-19 13:22:18.590 I/System.out( 824): Page01 -->onDestroy
以下是进了第一个页面,再进第二个页面,再回到第一个页面,再按HOME按键。正常拦截到。
[root ]# adb logcat -d -v time -s System.out:I 12-19 13:42:09.900 I/System.out( 852): Page01 -->onStart 12-19 13:42:09.910 I/System.out( 852): Page01 -->onResume 12-19 13:42:09.969 I/System.out( 852): Page01 -->onAttachedToWindow 12-19 13:42:19.659 I/System.out( 852): Page01 click to page02 12-19 13:42:19.721 I/System.out( 852): Page01 -->onPause 12-19 13:42:19.990 I/System.out( 852): Page02 -->onStart 12-19 13:42:19.990 I/System.out( 852): Page02 -->onResume 12-19 13:42:20.430 I/System.out( 852): Page01 -->onStop 12-19 13:42:29.149 I/System.out( 852): Page02 click to page01 (finish) 12-19 13:42:29.229 I/System.out( 852): Page02 -->onPause 12-19 13:42:29.349 I/System.out( 852): Page01 -->onStart 12-19 13:42:29.349 I/System.out( 852): Page01 -->onResume 12-19 13:42:29.752 I/System.out( 852): Page02 -->onStop 12-19 13:42:29.752 I/System.out( 852): Page02 -->onDestroy 12-19 13:42:45.779 I/System.out( 852): Page01 -->onKeyDown: keyCode: 3 12-19 13:42:45.779 I/System.out( 852): HOME has been pressed yet ...
在 Android 中使用各种控件(View)
TextView - 文本显示控件
Button - 按钮控件
ImageButton - 图片按钮控件
ImageView - 图片显示控件
CheckBox - 复选框控件
RadioButton - 单选框控件
AnalogClock - 钟表(带表盘的那种)控件
DigitalClock - 电子表控件
1、TextView 的 Demo
textview.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--
TextView - 文本显示控件
-->
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/textView" />
</LinearLayout>
_TextView.java
代码
package com.webabcd.view;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class _TextView extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.textview);
// 设置 Activity 的标题
setTitle("TextView");
TextView txt = (TextView) this.findViewById(R.id.textView);
// 设置文本显示控件的文本内容,需要换行的话就用“\n”
txt.setText("我是 TextView\n显示文字用的");
}
}
2、Button 的 Demo
button.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/textView" />
<!--
Button - 按钮控件
-->
<Button android:id="@+id/button"
android:layout_width="wrap_content" android:layout_height="wrap_content">
</Button>
</LinearLayout>
_Button.java
代码
package com.webabcd.view;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class _Button extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.button);
setTitle("Button");
Button btn = (Button) this.findViewById(R.id.button);
btn.setText("click me");
// setOnClickListener() - 响应按钮的鼠标单击事件
btn.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
TextView txt = (TextView) _Button.this.findViewById(R.id.textView);
txt.setText("按钮被单击了");
}
});
}
}
3、ImageButton 的 Demo
imagebutton.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/textView" />
<!--
ImageButton - 图片按钮控件
-->
<ImageButton android:id="@+id/imageButton"
android:layout_width="wrap_content" android:layout_height="wrap_content">
</ImageButton>
</LinearLayout>
_ImageButton.java
代码
package com.webabcd.view;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
public class _ImageButton extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.imagebutton);
setTitle("ImageButton");
ImageButton imgButton = (ImageButton) this.findViewById(R.id.imageButton);
// 设置图片按钮的背景
imgButton.setBackgroundResource(R.drawable.icon01);
// setOnClickListener() - 响应图片按钮的鼠标单击事件
imgButton.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
TextView txt = (TextView) _ImageButton.this.findViewById(R.id.textView);
txt.setText("图片按钮被单击了");
}
});
}
}
4、ImageView 的 Demo
imageview.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--
ImageView - 图片显示控件
-->
<ImageView android:id="@+id/imageView" android:layout_width="wrap_content"
android:layout_height="wrap_content"></ImageView>
</LinearLayout>
_ImageView.java
代码
package com.webabcd.view;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
public class _ImageView extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.imageview);
setTitle("ImageView");
ImageView imgView = (ImageView) this.findViewById(R.id.imageView);
// 指定需要显示的图片
imgView.setBackgroundResource(R.drawable.icon01);
}
}
5、CheckBox 的 Demo
checkbox.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/textView" />
<!--
CheckBox - 复选框控件
-->
<CheckBox android:text="CheckBox01" android:id="@+id/chk1"
android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
<CheckBox android:text="CheckBox02" android:id="@+id/chk2"
android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
<CheckBox android:text="CheckBox03" android:id="@+id/chk3"
android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
</LinearLayout>
_CheckBox.java
代码
package com.webabcd.view;
import android.app.Activity;
import android.os.Bundle;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
public class _CheckBox extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.checkbox);
setTitle("CheckBox");
CheckBox chk = (CheckBox) this.findViewById(R.id.chk1);
// setOnCheckedChangeListener() - 响应复选框的选中状态改变事件
chk.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
TextView txt = (TextView) _CheckBox.this.findViewById(R.id.textView);
txt.setText("CheckBox01 的选中状态:" + String.valueOf(isChecked));
}
});
}
}
6、RadioButton 的 Demo
radiobutton.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/textView" />
<!--
RadioButton - 单选框控件
RadioGroup - 对其内的单选框控件做分组
checkedButton - 指定组内被选中的单选框的 ID
-->
<RadioGroup android:id="@+id/radioGroup"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:checkedButton="@+id/rad3" android:orientation="horizontal"
android:gravity="center_vertical|center_horizontal">
<RadioButton android:text="rad1" android:id="@+id/rad1"
android:layout_width="wrap_content" android:layout_height="wrap_content"></RadioButton>
<RadioButton android:text="rad2" android:id="@+id/rad2"
android:layout_width="wrap_content" android:layout_height="wrap_content"></RadioButton>
<RadioButton android:text="rad3" android:id="@+id/rad3"
android:layout_width="wrap_content" android:layout_height="wrap_content"></RadioButton>
</RadioGroup>
</LinearLayout>
_RadioButton.java
代码
package com.webabcd.view;
import android.app.Activity;
import android.os.Bundle;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
public class _RadioButton extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.radiobutton);
setTitle("RadioButton");
RadioGroup group = (RadioGroup) this.findViewById(R.id.radioGroup);
// setOnCheckedChangeListener() - 响应单选框组内的选中项发生变化时的事件
group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
TextView txt = (TextView) _RadioButton.this.findViewById(R.id.textView);
txt.setText(((RadioButton)findViewById(checkedId)).getText() + " 被选中");
}
});
}
}
7、AnalogClock 的 Demo
analogclock.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--
AnalogClock - 钟表(带表盘的那种)控件
-->
<AnalogClock android:id="@+id/analogClock"
android:layout_width="wrap_content" android:layout_height="wrap_content">
</AnalogClock>
</LinearLayout>
_AnalogClock.java
代码
package com.webabcd.view;
import android.app.Activity;
import android.os.Bundle;
public class _AnalogClock extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.analogclcok);
setTitle("AnalogClock");
}
}
8、DigitalClock 的 Demo
digitalclock.xml
代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!--
DigitalClock - 电子表控件
-->
<DigitalClock android:id="@+id/digitalClock"
android:layout_width="wrap_content" android:layout_height="wrap_content">
</DigitalClock>
</LinearLayout>
_DigitalClock.java
代码
package com.webabcd.view;
import android.app.Activity;
import android.os.Bundle;
public class _DigitalClock extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(R.layout.digitalclcok);
setTitle("DigitalClcok");
}
}
http://www.cnblogs.com/webabcd/archive/2010/01/22/1653811.html