Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从不同类调用非静态方法(位于主类中)_Java_Android - Fatal编程技术网

Java 从不同类调用非静态方法(位于主类中)

Java 从不同类调用非静态方法(位于主类中),java,android,Java,Android,谢谢大家的回答和时间 你好, 我一直在尝试从Preferences类调用一个非静态方法,该方法位于我的主应用程序类中。 因为我调用的方法不是静态的,所以我实例化了main类,然后尝试调用我想要的特定方法,但它是强制关闭的 Preferences.class(从这里调用方法): Preference sorted = (Preference) findPreference("sortPref"); sorted.setOnPreferenceChangeListener(new P

谢谢大家的回答和时间

你好,

我一直在尝试从Preferences类调用一个非静态方法,该方法位于我的主应用程序类中。 因为我调用的方法不是静态的,所以我实例化了main类,然后尝试调用我想要的特定方法,但它是强制关闭的

Preferences.class(从这里调用方法):

Preference sorted = (Preference) findPreference("sortPref");
        sorted.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                Object d = new mainActivity();
                ((mainActivity) d).queryBookmarks();

                return true;
            }
        });
    public void queryBookmarks() {

        Toast.makeText(context, "blah blah", Toast.LENGTH_LONG).show(); 
//context is not null and the Toast is working if I  call it from mainActivity.class

        }
E/AndroidRuntime(11718): FATAL EXCEPTION: main
E/AndroidRuntime(11718): java.lang.NullPointerException
E/AndroidRuntime(11718):        at android.content.ContextWrapper.getContentReso
lver(ContextWrapper.java:90)
E/AndroidRuntime(11718):        at android.app.Activity.managedQuery(Activity.ja
va:1520)
E/AndroidRuntime(11718):        at com.queryBookmarks(
.java:101)
E/AndroidRuntime(11718):        at com.Preferences$2.onPrefer
enceChange(Preferences.java:47)
E/AndroidRuntime(11718):        at android.preference.Preference.callChangeListe
ner(Preference.java:756)
E/AndroidRuntime(11718):        at android.preference.ListPreference.onDialogClo
sed(ListPreference.java:219)
E/AndroidRuntime(11718):        at android.preference.DialogPreference.onDismiss
(DialogPreference.java:384)
E/AndroidRuntime(11718):        at android.app.Dialog$ListenersHandler.handleMes
sage(Dialog.java:1047)
E/AndroidRuntime(11718):        at android.os.Handler.dispatchMessage(Handler.ja
va:99)
E/AndroidRuntime(11718):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(11718):        at android.app.ActivityThread.main(ActivityThrea
d.java:4627)
E/AndroidRuntime(11718):        at java.lang.reflect.Method.invokeNative(Native
Method)
E/AndroidRuntime(11718):        at java.lang.reflect.Method.invoke(Method.java:5
21)
E/AndroidRuntime(11718):        at com.android.internal.os.ZygoteInit$MethodAndA
rgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(11718):        at com.android.internal.os.ZygoteInit.main(Zygot
eInit.java:626)
E/AndroidRuntime(11718):        at dalvik.system.NativeStart.main(Native Method)

D/dalvikvm(11718): GC_FOR_MALLOC freed 4248 objects / 282248 bytes in 40ms
W/ActivityManager(  244):   Force finishing activity com.package/.Pre
ferences
我调用的mainActivity.class方法:

Preference sorted = (Preference) findPreference("sortPref");
        sorted.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                Object d = new mainActivity();
                ((mainActivity) d).queryBookmarks();

                return true;
            }
        });
    public void queryBookmarks() {

        Toast.makeText(context, "blah blah", Toast.LENGTH_LONG).show(); 
//context is not null and the Toast is working if I  call it from mainActivity.class

        }
E/AndroidRuntime(11718): FATAL EXCEPTION: main
E/AndroidRuntime(11718): java.lang.NullPointerException
E/AndroidRuntime(11718):        at android.content.ContextWrapper.getContentReso
lver(ContextWrapper.java:90)
E/AndroidRuntime(11718):        at android.app.Activity.managedQuery(Activity.ja
va:1520)
E/AndroidRuntime(11718):        at com.queryBookmarks(
.java:101)
E/AndroidRuntime(11718):        at com.Preferences$2.onPrefer
enceChange(Preferences.java:47)
E/AndroidRuntime(11718):        at android.preference.Preference.callChangeListe
ner(Preference.java:756)
E/AndroidRuntime(11718):        at android.preference.ListPreference.onDialogClo
sed(ListPreference.java:219)
E/AndroidRuntime(11718):        at android.preference.DialogPreference.onDismiss
(DialogPreference.java:384)
E/AndroidRuntime(11718):        at android.app.Dialog$ListenersHandler.handleMes
sage(Dialog.java:1047)
E/AndroidRuntime(11718):        at android.os.Handler.dispatchMessage(Handler.ja
va:99)
E/AndroidRuntime(11718):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(11718):        at android.app.ActivityThread.main(ActivityThrea
d.java:4627)
E/AndroidRuntime(11718):        at java.lang.reflect.Method.invokeNative(Native
Method)
E/AndroidRuntime(11718):        at java.lang.reflect.Method.invoke(Method.java:5
21)
E/AndroidRuntime(11718):        at com.android.internal.os.ZygoteInit$MethodAndA
rgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(11718):        at com.android.internal.os.ZygoteInit.main(Zygot
eInit.java:626)
E/AndroidRuntime(11718):        at dalvik.system.NativeStart.main(Native Method)

D/dalvikvm(11718): GC_FOR_MALLOC freed 4248 objects / 282248 bytes in 40ms
W/ActivityManager(  244):   Force finishing activity com.package/.Pre
ferences
日志猫:

Preference sorted = (Preference) findPreference("sortPref");
        sorted.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                Object d = new mainActivity();
                ((mainActivity) d).queryBookmarks();

                return true;
            }
        });
    public void queryBookmarks() {

        Toast.makeText(context, "blah blah", Toast.LENGTH_LONG).show(); 
//context is not null and the Toast is working if I  call it from mainActivity.class

        }
E/AndroidRuntime(11718): FATAL EXCEPTION: main
E/AndroidRuntime(11718): java.lang.NullPointerException
E/AndroidRuntime(11718):        at android.content.ContextWrapper.getContentReso
lver(ContextWrapper.java:90)
E/AndroidRuntime(11718):        at android.app.Activity.managedQuery(Activity.ja
va:1520)
E/AndroidRuntime(11718):        at com.queryBookmarks(
.java:101)
E/AndroidRuntime(11718):        at com.Preferences$2.onPrefer
enceChange(Preferences.java:47)
E/AndroidRuntime(11718):        at android.preference.Preference.callChangeListe
ner(Preference.java:756)
E/AndroidRuntime(11718):        at android.preference.ListPreference.onDialogClo
sed(ListPreference.java:219)
E/AndroidRuntime(11718):        at android.preference.DialogPreference.onDismiss
(DialogPreference.java:384)
E/AndroidRuntime(11718):        at android.app.Dialog$ListenersHandler.handleMes
sage(Dialog.java:1047)
E/AndroidRuntime(11718):        at android.os.Handler.dispatchMessage(Handler.ja
va:99)
E/AndroidRuntime(11718):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(11718):        at android.app.ActivityThread.main(ActivityThrea
d.java:4627)
E/AndroidRuntime(11718):        at java.lang.reflect.Method.invokeNative(Native
Method)
E/AndroidRuntime(11718):        at java.lang.reflect.Method.invoke(Method.java:5
21)
E/AndroidRuntime(11718):        at com.android.internal.os.ZygoteInit$MethodAndA
rgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(11718):        at com.android.internal.os.ZygoteInit.main(Zygot
eInit.java:626)
E/AndroidRuntime(11718):        at dalvik.system.NativeStart.main(Native Method)

D/dalvikvm(11718): GC_FOR_MALLOC freed 4248 objects / 282248 bytes in 40ms
W/ActivityManager(  244):   Force finishing activity com.package/.Pre
ferences
感谢您的帮助!:)


编辑:我不能将queryBookmarks()设置为静态函数,因为它使用的是Android函数managedQuery,而不是静态函数。

上下文来自哪里?听起来像是例外,
上下文
为空。您是否需要自己将
上下文
注入到
Dmarks
实例中?无论如何,这个值需要设置

还有,这样的代码有什么意义

Object d = new Dmarks();
((Dmarks) d).queryBookmarks();
而不仅仅是写作

Dmarks d = new Dmarks();
d.queryBookmarks();

Contex可能不为null,但看起来它缺少一些东西,为什么不尝试将主类的实际实例注入到首选项中

//in main    
preferncesInstance.setDmarks(this);

然后,您可以在工作实例上调用queryBook…

生成
Dmarks
实现
首选项。然后,您将拥有一个正确初始化的上下文。

Dmarks是您的主要
应用程序
类吗?您不应尝试在
活动中实例化此项。相反,使用活动中的函数获取当前实例

您需要将其强制转换为子类类型:

DMark dmark = (DMark)getApplication();
dmark.queryBookmarks();


我认为您还必须调用toast setView()并发送合适的视图,正如我在评论中提到的,context不是null,当我从Dmarks.class中调用它时,queryBookmarks()方法可以完美地工作。关于代码编写,你是对的。。。没有要点:)只是纯Eclipse自动完成。顺便说一下,这不是真正的queryBookmarks()方法。要长得多。。。但正如我所说,它已经过测试,工作得非常完美,所以它不是导致力接近的原因。(还测试了getBaseContext()而不是context…也可以工作)queryBookmarks()在普通Dmarks实例中的运行方式与在创建没有参数构造函数的新实例时的运行方式有所不同。也许Android运行时正在注入一些类依赖项?在
ContextWrapper.java:90发生了什么?这是NPE的真正来源。我认为你是对的,这是上下文的问题,但我尝试用所有东西替换上下文-getBaseContext(),getApplicationContext(),甚至Dmarks。这-同样的力量关闭。。。我不知道我遗漏了什么:\n不确定我是否理解正确的位置,但我得到“标记上的语法错误”这个,删除这个标记“毫无疑问。。。我是Android和Java的初学者,我正在学习基础知识,同时开发一些用于实践目的的东西。@Falmari显然他正在尝试学习Java,如果你能指出他的代码中的具体问题,会更有帮助,或者解释为什么他的方法是错误的。当你仅仅发布一个很小的部分时,很难指出代码的具体问题,而且显然java和OO编程的基础知识有很大的漏洞。如果
Dmarks
是一个
活动
类,你永远不应该每次都用
new
实例化它。如果您需要在两个活动之间进行沟通,请使用意图或通过服务进行沟通。感谢回复。是的,Dmarks是一项活动(ListActivity)。我将阅读关于意图的使用,以便在两个活动之间进行通信(希望我能及时更好地理解Android API和Java)。谢谢玛拉,谢谢你的回复!Dmarks是我的主要应用程序类。如果我理解正确,我应该这样写:Dmarks dmark=(Dmarks)getApplication();dmark.queryBookmarks();而不是:Dmarks d=新Dmarks();d、 queryBookmarks();我尝试了这个,得到了“不能从应用程序强制转换到Dmarks”。所谓主应用程序类,我指的是扩展“应用程序”的类。从你的错误来看,情况似乎并非如此。。否。Dmarks扩展了主活动类(listActivity)。谢谢你的帮助!:)哦,好的。无法从一个活动调用另一个活动中的成员函数。你需要重新考虑你的班级组织。这个函数试图做什么?为什么在这两项活动中都需要它?您可以为您的活动创建一个公共基类,或者将其移动到一个应用程序子类中?我将把它放在一个应用程序子类中,在那里它可以从所有活动中访问。活动类本身应该只负责视图。在模型视图控制模式中,您的活动是视图,而应用程序包含模型和控制器。我尝试将此代码放入主活动类中,但它无法识别FindReference()首选项排序=(首选项)FindReference(“sortPref”);sorted.setOnPreferenceChangeListener(新首选项.OnPreferenceChangeListener(){public boolean onPreferenceChange(首选项首选项,对象newValue){//Toast.makeText(getBaseContext(),“书签已排序”,Toast.LENGTH_LONG).show();返回true;});将类声明更改为
class Dmarks implements Preference.OnPreferenceChangeListener
,然后将
onPreferenceChange()
方法添加到类中。Dmarks->public class Dmarks扩展了ListActivity。所以我不得不这么做:公共类Dmarks扩展了ListActivity在PreferenceChangeListener上的实现。没有错误,但什么也没有发生。我会调查的。非常感谢。